beech-api 3.5.7 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +401 -186
- package/index.js +2 -3
- package/package.json +15 -8
- package/packages/cli/beech +2 -2
- package/packages/cli/bin/{beech.js → beech-app.js} +105 -43
- package/packages/cli/bin/beech-service.js +133 -0
- package/packages/cli/core/auth/Credentials.js +76 -35
- package/packages/cli/core/auth/Passport.js +318 -184
- package/packages/cli/core/auth/_Request.js +12 -0
- package/packages/cli/core/configure/_gitignore +9 -1
- package/packages/cli/core/configure/app.config-basic.js +10 -10
- package/packages/cli/core/configure/app.config-sequelize.js +17 -12
- package/packages/cli/core/configure/beech.config.js +8 -0
- package/packages/cli/core/configure/global.config-basic.js +4 -4
- package/packages/cli/core/configure/global.config-sequelize.js +4 -4
- package/packages/cli/core/configure/passport.config.js +5 -15
- package/packages/cli/core/databases/mysql.js +53 -29
- package/packages/cli/core/databases/sequelize.js +135 -105
- package/packages/cli/core/databases/test.js +168 -0
- package/packages/cli/core/file-walk/file-walk.js +31 -14
- package/packages/cli/core/generator/_add-on +15 -2
- package/packages/cli/core/generator/_endpoints +15 -82
- package/packages/cli/core/generator/_endpoints_basic +39 -0
- package/packages/cli/core/generator/_help +12 -11
- package/packages/cli/core/generator/_help_create +11 -0
- package/packages/cli/core/generator/_help_service +11 -0
- package/packages/cli/core/generator/_models +20 -15
- package/packages/cli/core/generator/{_basic-models → _models_basic} +0 -2
- package/packages/cli/core/generator/_package +5 -4
- package/packages/cli/core/generator/index.js +302 -95
- package/packages/cli/core/helpers/math.js +55 -0
- package/packages/cli/core/helpers/poolEntity.js +31 -0
- package/packages/cli/core/index.js +97 -28
- package/packages/cli/core/origin/index.js +2 -0
- package/packages/cli/core/origin/whitelist/cors.js +91 -0
- package/packages/cli/core/services/http.express.js +338 -201
- package/packages/cli/core/test/utils.js +5 -5
- package/packages/lib/index.js +4 -0
- package/packages/lib/src/endpoint.js +98 -0
- package/packages/lib/src/salt.js +3 -0
- package/packages/lib/src/schema.js +62 -0
- package/packages/lib/src/user.js +196 -0
- package/packages/package.json +4 -6
- package/packages/public/icon/beech_128.png +0 -0
- package/packages/cli/core/generator/_create +0 -7
- package/packages/lib/beech.js +0 -136
- package/packages/lib/salt.js +0 -3
- /package/packages/cli/core/generator/{_basic-helpers → _helpers_basic} +0 -0
|
@@ -1,173 +1,263 @@
|
|
|
1
1
|
const appRoot = require("app-root-path");
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const passport_config_file = appRoot + "
|
|
3
|
+
const passport_config_file = appRoot + "\\passport.config.js";
|
|
4
4
|
const md5 = require("md5");
|
|
5
|
-
const secret = require("../../../lib/salt").salt;
|
|
5
|
+
const secret = require("../../../lib/src/salt").salt;
|
|
6
|
+
const { findPassportPk } = require("../helpers/poolEntity");
|
|
7
|
+
const { Rand } = require("../helpers/math");
|
|
6
8
|
const { QueryTypes } = require("sequelize");
|
|
7
9
|
|
|
8
10
|
module.exports = {
|
|
9
11
|
init() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
passportTable,
|
|
47
|
-
passportUsernameField,
|
|
48
|
-
username,
|
|
49
|
-
passportPasswordField,
|
|
50
|
-
md5(password + secret)
|
|
51
|
-
], (err, result) => {
|
|
52
|
-
if (err) {
|
|
53
|
-
return done(err, null);
|
|
54
|
-
} else {
|
|
55
|
-
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
} else if (pool_base == "sequelize") {
|
|
59
|
-
// pool base is Sequelize
|
|
60
|
-
try {
|
|
61
|
-
let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
|
|
62
|
-
replacements: {
|
|
63
|
-
fields: passportFields,
|
|
64
|
-
username: username,
|
|
65
|
-
password: md5(password + secret)
|
|
66
|
-
},
|
|
67
|
-
type: QueryTypes.SELECT
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
try {
|
|
14
|
+
var passport_config;
|
|
15
|
+
const p1 = new Promise((resolve, reject) => {
|
|
16
|
+
/**
|
|
17
|
+
* Resolve ref:
|
|
18
|
+
* [0=passport_file_exists, 1=jwt_allow, 2=db_passport_map_is_connect]
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
if (fs.existsSync(passport_config_file)) {
|
|
22
|
+
const auth = require("./Credentials");
|
|
23
|
+
passport_config = require(passport_config_file);
|
|
24
|
+
if (passport_config.jwt_allow) {
|
|
25
|
+
global.Credentials = auth.credentials;
|
|
26
|
+
// loop check db connect is true
|
|
27
|
+
fs.readFile("./app.config.js", "utf-8", (err, data) => {
|
|
28
|
+
if(err) {
|
|
29
|
+
reject(err);
|
|
30
|
+
} else {
|
|
31
|
+
let mineConfDb = eval(data).database_config;
|
|
32
|
+
mineConfDb.filter((e, k) => {
|
|
33
|
+
if(e.name == passport_config.model.name) {
|
|
34
|
+
if(e.is_connect) {
|
|
35
|
+
resolve([true, true, true]);
|
|
36
|
+
} else {
|
|
37
|
+
// Database of Passport mapped is closed.
|
|
38
|
+
resolve([true, true, false]);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
if(mineConfDb.length == k+1) {
|
|
42
|
+
// Database of Passport mapped is Name not match.
|
|
43
|
+
resolve([true, true, null]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
68
48
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
49
|
+
} else {
|
|
50
|
+
global.Credentials = [];
|
|
51
|
+
resolve([true, false, null]);
|
|
72
52
|
}
|
|
73
53
|
} else {
|
|
74
|
-
|
|
54
|
+
global.Credentials = [];
|
|
55
|
+
//const Requests = require("./_Request");
|
|
56
|
+
//global.Credentials = Requests.requests; ----> // [Closed] TODO check passport.config file if not exists show error when file src/ using the JWT (maybe for show JWT is ON/OFF)
|
|
57
|
+
resolve([false, null, null]);
|
|
75
58
|
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
59
|
+
});
|
|
60
|
+
Promise.all([p1]).then(final => {
|
|
61
|
+
// Checking passport file, allow, mapped
|
|
62
|
+
if(final[0][0] && final[0][1] && final[0][2]) {
|
|
63
|
+
var passport = require("passport")
|
|
64
|
+
LocalStrategy = require("passport-local").Strategy,
|
|
65
|
+
GoogleStrategy = require("passport-google-oauth").OAuth2Strategy,
|
|
66
|
+
FacebookStrategy = require('passport-facebook').Strategy;
|
|
67
|
+
var passportJWT = require("passport-jwt"),
|
|
68
|
+
JWTStrategy = passportJWT.Strategy,
|
|
69
|
+
ExtractJWT = passportJWT.ExtractJwt;
|
|
70
|
+
// declare constant
|
|
71
|
+
var passportUsernameField = passport_config.model.username_field || "username";
|
|
72
|
+
var passportPasswordField = passport_config.model.password_field || "password";
|
|
73
|
+
var passportTable = passport_config.model.table || "users";
|
|
74
|
+
var pool = eval("sql." + passport_config.model.name);
|
|
75
|
+
// find passport primary key
|
|
76
|
+
findPassportPk(pool_base, pool, passportTable, passport_config.model.fields, (err, passportFields) => {
|
|
77
|
+
if(err) {
|
|
78
|
+
resolve([err, true, true, true]);
|
|
95
79
|
} else {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
80
|
+
// Passport initial with token (encoder)
|
|
81
|
+
passport.use(new LocalStrategy({
|
|
82
|
+
usernameField: passportUsernameField,
|
|
83
|
+
passwordField: passportPasswordField
|
|
84
|
+
}, async (username, password, done) => {
|
|
85
|
+
if (pool) {
|
|
86
|
+
if (pool_base == "basic") {
|
|
87
|
+
// pool base is MySQL
|
|
88
|
+
pool.query("SELECT " + passportFields + " FROM ?? WHERE ?? = ? AND ?? = ?", [
|
|
89
|
+
passportTable,
|
|
90
|
+
passportUsernameField,
|
|
91
|
+
username,
|
|
92
|
+
passportPasswordField,
|
|
93
|
+
md5(password + secret)
|
|
94
|
+
], (err, result) => {
|
|
95
|
+
if (err) {
|
|
96
|
+
return done(err, null);
|
|
97
|
+
} else {
|
|
98
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} else if (pool_base == "sequelize") {
|
|
102
|
+
// pool base is Sequelize
|
|
103
|
+
try {
|
|
104
|
+
let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
|
|
105
|
+
replacements: {
|
|
106
|
+
fields: passportFields,
|
|
107
|
+
username: username,
|
|
108
|
+
password: md5(password + secret)
|
|
109
|
+
},
|
|
110
|
+
type: QueryTypes.SELECT
|
|
111
|
+
});
|
|
112
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
113
|
+
} catch (error) {
|
|
114
|
+
return done(error, null);
|
|
115
|
+
}
|
|
116
|
+
} else {
|
|
117
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
return done(null, null, true);
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
|
|
124
|
+
// Passport jwt payload (decoder)
|
|
125
|
+
passport.use(new JWTStrategy({
|
|
126
|
+
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
|
|
127
|
+
secretOrKey: passport_config.secret
|
|
128
|
+
}, async (jwtPayload, done) => {
|
|
129
|
+
let pool = eval("sql." + passport_config.model.name);
|
|
130
|
+
if (pool) {
|
|
131
|
+
if (pool_base == "basic") {
|
|
132
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", (err, pk) => {
|
|
133
|
+
if(err) {
|
|
134
|
+
return done(err, null);
|
|
135
|
+
} else {
|
|
136
|
+
let fieldPk = pk[0].Column_name;
|
|
137
|
+
// pool base is MySQL
|
|
138
|
+
pool.query("SELECT " + passportFields + " FROM ?? WHERE " + fieldPk + " = ?", [
|
|
139
|
+
passportTable,
|
|
140
|
+
jwtPayload[fieldPk]
|
|
141
|
+
], (err, result) => {
|
|
142
|
+
if (err) {
|
|
143
|
+
return done(err, null);
|
|
144
|
+
} else {
|
|
145
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
} else if (pool_base == "sequelize") {
|
|
151
|
+
// pool base is Sequelize
|
|
152
|
+
try {
|
|
153
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", { type: QueryTypes.SELECT }).then((pk) => {
|
|
154
|
+
let fieldPk = pk[0].Column_name;
|
|
155
|
+
pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + fieldPk + " = :pk", {
|
|
156
|
+
replacements: {
|
|
157
|
+
pk: + jwtPayload[fieldPk]
|
|
158
|
+
},
|
|
159
|
+
type: QueryTypes.SELECT,
|
|
160
|
+
}).then((result) => {
|
|
161
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
162
|
+
}).catch((err) => {
|
|
163
|
+
return done(err, null);
|
|
164
|
+
});
|
|
165
|
+
}).catch((err) => {
|
|
166
|
+
return done(err, null);
|
|
167
|
+
});
|
|
168
|
+
} catch (error) {
|
|
169
|
+
return done(error, null);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
return done(null, null, true);
|
|
176
|
+
}
|
|
177
|
+
}));
|
|
178
|
+
|
|
179
|
+
// Declare head authentication enpoint for all strategy
|
|
180
|
+
let auth_endpoint = (passport_config.auth_endpoint) ? (passport_config.auth_endpoint[ 0 ] === "/" ? passport_config.auth_endpoint : "/" + passport_config.auth_endpoint) : "/authentication";
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Passport Google Strategy
|
|
184
|
+
*
|
|
185
|
+
*/
|
|
186
|
+
let google_callbackURL = (passport_config.strategy.google.callbackURL) ? (passport_config.strategy.google.callbackURL[ 0 ] === "/" ? passport_config.strategy.google.callbackURL : "/" + passport_config.strategy.google.callbackURL) : "/google/callback";
|
|
187
|
+
passport.use(new GoogleStrategy({
|
|
188
|
+
clientID: passport_config.strategy.google.client_id,
|
|
189
|
+
clientSecret: passport_config.strategy.google.client_secret,
|
|
190
|
+
callbackURL: auth_endpoint + google_callbackURL
|
|
191
|
+
}, (accessToken, refreshToken, profile, done) => {
|
|
192
|
+
// find google user
|
|
193
|
+
let googleIdField = (passport_config.strategy.google.local_profile_fields.google_id) ? passport_config.strategy.google.local_profile_fields.google_id : "google_id";
|
|
194
|
+
this.findOrCreate(passport_config, "google", passportFields, passportTable, accessToken, refreshToken, profile, googleIdField, (err, res, dbFailed) => {
|
|
195
|
+
if (err) {
|
|
196
|
+
return done(err);
|
|
197
|
+
} else {
|
|
198
|
+
return done(err, res, dbFailed);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Passport Facebook Strategy
|
|
205
|
+
*
|
|
206
|
+
*/
|
|
207
|
+
let facebook_callbackURL = (passport_config.strategy.facebook.callbackURL) ? (passport_config.strategy.facebook.callbackURL[ 0 ] === "/" ? passport_config.strategy.facebook.callbackURL : "/" + passport_config.strategy.facebook.callbackURL) : "/facebook/callback";
|
|
208
|
+
// merge fields permisions
|
|
209
|
+
let allow_permisions_fields = [ ...new Set([ ...[ 'id', 'displayName', 'name', 'photos', 'email', 'location' ], ...(passport_config.strategy.facebook.profileFieldsAllow || []) ]) ];
|
|
210
|
+
passport.use(new FacebookStrategy({
|
|
211
|
+
clientID: passport_config.strategy.facebook.app_id,
|
|
212
|
+
clientSecret: passport_config.strategy.facebook.app_secret,
|
|
213
|
+
callbackURL: auth_endpoint + facebook_callbackURL,
|
|
214
|
+
profileFields: allow_permisions_fields
|
|
215
|
+
}, (accessToken, refreshToken, profile, done) => {
|
|
216
|
+
// Check if the email permission is granted
|
|
217
|
+
/**
|
|
218
|
+
* Update : Permissions Reference for Meta Technologies APIs.
|
|
219
|
+
* Starting on or after October 27, 2023, if your app requests permission to use an endpoint to access an app user’s data
|
|
220
|
+
* Learn more : https://developers.facebook.com/docs/permissions
|
|
221
|
+
*
|
|
222
|
+
* From now! Disabled check if email permission granted
|
|
223
|
+
*/
|
|
224
|
+
//if (!profile.emails || profile.emails.length === 0) {
|
|
225
|
+
// return done(new Error('Email permission not granted.'));
|
|
226
|
+
//}
|
|
227
|
+
// find facebook user
|
|
228
|
+
let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
|
|
229
|
+
this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
|
|
230
|
+
if (err) {
|
|
231
|
+
return done(err);
|
|
232
|
+
} else {
|
|
233
|
+
return done(err, res, dbFailed);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}));
|
|
237
|
+
// Everything is Perfectly
|
|
238
|
+
resolve([null, true, true, true]);
|
|
239
|
+
} // end if check err findPassportPk
|
|
240
|
+
}); // end findPassportPk
|
|
241
|
+
} else if(final[0][0] && final[0][1] && final[0][2] === false) {
|
|
242
|
+
// Database connection mapped is Closed.
|
|
243
|
+
resolve([`Database connection name \`${passport_config.model.name}\` is CLOSED. Checking ON/OFF inside app.conifg.js file.`, true, true, false]);
|
|
244
|
+
} else if(final[0][0] && final[0][1] && !final[0][2]) {
|
|
245
|
+
// Passport Database connection name is NOT MATCH.
|
|
246
|
+
resolve([`Connection name \`${passport_config.model.name}\` with Passport model name mapped is NOT MATCH. Checking name to match it.`, true, true, false]);
|
|
247
|
+
} else if(final[0][0] && !final[0][1] && final[0][2] === null) {
|
|
248
|
+
// JWT not allow
|
|
249
|
+
resolve([null, true, false, null]);
|
|
138
250
|
} else {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Passport Facebook Strategy
|
|
146
|
-
*
|
|
147
|
-
*/
|
|
148
|
-
let facebook_callbackURL = (passport_config.strategy.facebook.callbackURL) ? (passport_config.strategy.facebook.callbackURL[ 0 ] === "/" ? passport_config.strategy.facebook.callbackURL : "/" + passport_config.strategy.facebook.callbackURL) : "/facebook/callback";
|
|
149
|
-
// merge fields permisions
|
|
150
|
-
let allow_permisions_fields = [ ...new Set([ ...[ 'id', 'email' ], ...passport_config.strategy.facebook.profileFieldsAllow ]) ];
|
|
151
|
-
passport.use(new FacebookStrategy({
|
|
152
|
-
clientID: passport_config.strategy.facebook.app_id,
|
|
153
|
-
clientSecret: passport_config.strategy.facebook.app_secret,
|
|
154
|
-
callbackURL: auth_endpoint + facebook_callbackURL,
|
|
155
|
-
profileFields: allow_permisions_fields
|
|
156
|
-
}, (accessToken, refreshToken, profile, done) => {
|
|
157
|
-
// find facebook user
|
|
158
|
-
let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
|
|
159
|
-
this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
|
|
160
|
-
if (err) {
|
|
161
|
-
return done(err);
|
|
162
|
-
} else {
|
|
163
|
-
return done(err, res, dbFailed);
|
|
164
|
-
}
|
|
251
|
+
// JWT file not found, Or JWT not intitialize.
|
|
252
|
+
resolve([null, false, null, null]);
|
|
253
|
+
} // end if check Resolve ref:
|
|
254
|
+
}).catch(err => {
|
|
255
|
+
throw err;
|
|
165
256
|
});
|
|
257
|
+
} catch (error) {
|
|
258
|
+
throw error;
|
|
166
259
|
}
|
|
167
|
-
|
|
168
|
-
} catch (error) {
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
260
|
+
});
|
|
171
261
|
},
|
|
172
262
|
findOrCreate(passport_config, strategy_name, passportFields, passportTable, accessToken, refreshToken, profile, idField, cb) {
|
|
173
263
|
let pool = eval("sql." + passport_config.model.name);
|
|
@@ -181,7 +271,7 @@ module.exports = {
|
|
|
181
271
|
// prepare data for store
|
|
182
272
|
let usr = passport_config.model.username_field || "username";
|
|
183
273
|
let psw = passport_config.model.password_field || "password";
|
|
184
|
-
let
|
|
274
|
+
let usrProfile = Rand(10);
|
|
185
275
|
let md5Psw = md5(profile.id + secret);
|
|
186
276
|
// check strategy name for store
|
|
187
277
|
if (strategy_name == "google") {
|
|
@@ -202,34 +292,51 @@ module.exports = {
|
|
|
202
292
|
].filter((el) => el != null));
|
|
203
293
|
// Store google profile
|
|
204
294
|
if (pool_base == "basic") {
|
|
205
|
-
//
|
|
206
|
-
|
|
295
|
+
// check null and remove it.
|
|
296
|
+
let basicReplacement = new Set([
|
|
207
297
|
passportTable,
|
|
208
298
|
usr,
|
|
209
299
|
psw,
|
|
210
300
|
idField,
|
|
211
301
|
fields,
|
|
212
|
-
|
|
302
|
+
usrProfile,
|
|
213
303
|
md5Psw,
|
|
214
304
|
profile.id,
|
|
215
305
|
values
|
|
216
|
-
]
|
|
306
|
+
]);
|
|
307
|
+
delete basicReplacement.delete(null);
|
|
308
|
+
basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
309
|
+
// pool base is MySQL
|
|
310
|
+
pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
|
|
217
311
|
data.result = result;
|
|
218
312
|
data.google = profile;
|
|
219
313
|
cb(err, data);
|
|
220
314
|
});
|
|
221
315
|
} else if (pool_base == "sequelize") {
|
|
316
|
+
// check null and remove it.
|
|
317
|
+
let sequelizeReplacement = new Set([
|
|
318
|
+
passportTable,
|
|
319
|
+
usr,
|
|
320
|
+
psw,
|
|
321
|
+
idField,
|
|
322
|
+
fields,
|
|
323
|
+
usrProfile,
|
|
324
|
+
md5Psw,
|
|
325
|
+
profile.id,
|
|
326
|
+
values
|
|
327
|
+
]);
|
|
328
|
+
sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
222
329
|
// pool base is Sequelize
|
|
223
330
|
try {
|
|
224
|
-
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}
|
|
331
|
+
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
|
|
225
332
|
replacements: {
|
|
226
|
-
usr:
|
|
227
|
-
psw:
|
|
228
|
-
idField:
|
|
229
|
-
|
|
333
|
+
usr: sequelizeReplacement[1],
|
|
334
|
+
psw: sequelizeReplacement[2],
|
|
335
|
+
idField: sequelizeReplacement[3],
|
|
336
|
+
usrProfile: usrProfile,
|
|
230
337
|
md5Psw: md5Psw,
|
|
231
338
|
profileId: profile.id,
|
|
232
|
-
values: values
|
|
339
|
+
values: values.length ? values : []
|
|
233
340
|
},
|
|
234
341
|
type: QueryTypes.INSERT
|
|
235
342
|
});
|
|
@@ -240,7 +347,7 @@ module.exports = {
|
|
|
240
347
|
cb(error, null);
|
|
241
348
|
}
|
|
242
349
|
} else {
|
|
243
|
-
cb({ error: "Base pool
|
|
350
|
+
cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
244
351
|
}
|
|
245
352
|
} else { // find found
|
|
246
353
|
let users = {};
|
|
@@ -251,7 +358,18 @@ module.exports = {
|
|
|
251
358
|
cb(err, users);
|
|
252
359
|
}
|
|
253
360
|
} else if (strategy_name == "facebook") {
|
|
254
|
-
|
|
361
|
+
// STEP 1: check email empty for username
|
|
362
|
+
if(passport_config.strategy.facebook.local_profile_fields.email) { // Now support only Google, Because Facebook requests permission: https://developers.facebook.com/docs/permissions
|
|
363
|
+
if(!profile.emails) {
|
|
364
|
+
return cb(JSON.stringify({
|
|
365
|
+
code: 500,
|
|
366
|
+
status: "ERR_FACEBOOK_PROFILE_PERMISSIONS",
|
|
367
|
+
error: "Facebook needed allow `email` and `public_profile` permisions: https://developers.facebook.com/docs/permissions"
|
|
368
|
+
}), null);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// STEP 2: find not found and create
|
|
372
|
+
if (!result[ 0 ]) {
|
|
255
373
|
// filter fields
|
|
256
374
|
let fields = [].concat.apply([], [
|
|
257
375
|
(passport_config.strategy.facebook.local_profile_fields.name) ? passport_config.strategy.facebook.local_profile_fields.name : null,
|
|
@@ -262,40 +380,57 @@ module.exports = {
|
|
|
262
380
|
// fileter values
|
|
263
381
|
let values = [].concat.apply([], [
|
|
264
382
|
(passport_config.strategy.facebook.local_profile_fields.name) ? profile.displayName : null,
|
|
265
|
-
(passport_config.strategy.facebook.local_profile_fields.email) ? profile.emails[ 0 ].value : null,
|
|
383
|
+
(passport_config.strategy.facebook.local_profile_fields.email) ? (profile.emails) ? profile.emails[ 0 ].value : null : null,
|
|
266
384
|
(passport_config.strategy.facebook.local_profile_fields.photos) ? profile.photos[ 0 ].value : null,
|
|
267
385
|
(passport_config.strategy.facebook.local_profile_fields.locate) ? profile._json.location.name : null
|
|
268
386
|
].filter((el) => el != null));
|
|
269
387
|
// Store facebook profile
|
|
270
388
|
if (pool_base == "basic") {
|
|
271
|
-
//
|
|
272
|
-
|
|
389
|
+
// check null and remove it.
|
|
390
|
+
let basicReplacement = new Set([
|
|
273
391
|
passportTable,
|
|
274
392
|
usr,
|
|
275
393
|
psw,
|
|
276
394
|
idField,
|
|
277
395
|
fields,
|
|
278
|
-
|
|
396
|
+
usrProfile,
|
|
279
397
|
md5Psw,
|
|
280
398
|
profile.id,
|
|
281
399
|
values
|
|
282
|
-
]
|
|
400
|
+
]);
|
|
401
|
+
delete basicReplacement.delete(null);
|
|
402
|
+
basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
403
|
+
// pool base is MySQL
|
|
404
|
+
pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
|
|
283
405
|
data.result = result;
|
|
284
406
|
data.facebook = profile;
|
|
285
407
|
cb(err, data);
|
|
286
408
|
});
|
|
287
409
|
} else if (pool_base == "sequelize") {
|
|
410
|
+
// check null and remove it.
|
|
411
|
+
let sequelizeReplacement = new Set([
|
|
412
|
+
passportTable,
|
|
413
|
+
usr,
|
|
414
|
+
psw,
|
|
415
|
+
idField,
|
|
416
|
+
fields,
|
|
417
|
+
usrProfile,
|
|
418
|
+
md5Psw,
|
|
419
|
+
profile.id,
|
|
420
|
+
values
|
|
421
|
+
]);
|
|
422
|
+
sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
288
423
|
// pool base is Sequelize
|
|
289
424
|
try {
|
|
290
|
-
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}
|
|
425
|
+
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
|
|
291
426
|
replacements: {
|
|
292
|
-
usr:
|
|
293
|
-
psw:
|
|
294
|
-
idField:
|
|
295
|
-
|
|
427
|
+
usr: sequelizeReplacement[1],
|
|
428
|
+
psw: sequelizeReplacement[2],
|
|
429
|
+
idField: sequelizeReplacement[3],
|
|
430
|
+
usrProfile: usrProfile,
|
|
296
431
|
md5Psw: md5Psw,
|
|
297
432
|
profileId: profile.id,
|
|
298
|
-
values: values
|
|
433
|
+
values: values.length ? values : []
|
|
299
434
|
},
|
|
300
435
|
type: QueryTypes.INSERT
|
|
301
436
|
});
|
|
@@ -306,7 +441,7 @@ module.exports = {
|
|
|
306
441
|
cb(error, null);
|
|
307
442
|
}
|
|
308
443
|
} else {
|
|
309
|
-
cb({ error: "Base pool
|
|
444
|
+
cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
310
445
|
}
|
|
311
446
|
} else { // find found
|
|
312
447
|
let users = {};
|
|
@@ -348,11 +483,10 @@ module.exports = {
|
|
|
348
483
|
return cb(error, null);
|
|
349
484
|
}
|
|
350
485
|
} else {
|
|
351
|
-
return done({ error: "Base pool
|
|
486
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
352
487
|
}
|
|
353
488
|
} catch (error) {
|
|
354
489
|
cb(error, null);
|
|
355
490
|
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
}
|
|
491
|
+
},
|
|
492
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
requests: (req, res, next) => {
|
|
3
|
+
console.log(res.statusCode);
|
|
4
|
+
console.log(req.url, req.method);
|
|
5
|
+
return res.status(401).json({
|
|
6
|
+
code: 404,
|
|
7
|
+
status: "404_NOT_FOUND",
|
|
8
|
+
error: "Passport config file not found.",
|
|
9
|
+
});
|
|
10
|
+
next();
|
|
11
|
+
},
|
|
12
|
+
};
|