@strapi/plugin-users-permissions 5.50.1 → 5.51.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/admin/src/pages/Roles/pages/EditPage.jsx +1 -1
- package/admin/src/translations/en.json +2 -0
- package/admin/src/translations/ko.json +2 -1
- package/dist/admin/pages/Roles/pages/EditPage.js +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.js.map +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs +1 -1
- package/dist/admin/pages/Roles/pages/EditPage.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +2 -1
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +2 -1
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/server/_virtual/_node_crypto.js +10 -0
- package/dist/server/_virtual/_node_crypto.js.map +1 -0
- package/dist/server/_virtual/_node_crypto.mjs +7 -0
- package/dist/server/_virtual/_node_crypto.mjs.map +1 -0
- package/dist/server/_virtual/_node_url.js +10 -0
- package/dist/server/_virtual/_node_url.js.map +1 -0
- package/dist/server/_virtual/_node_url.mjs +7 -0
- package/dist/server/_virtual/_node_url.mjs.map +1 -0
- package/dist/server/controllers/auth.js +19 -19
- package/dist/server/controllers/auth.js.map +1 -1
- package/dist/server/controllers/auth.mjs +19 -18
- package/dist/server/controllers/auth.mjs.map +1 -1
- package/dist/server/services/providers-registry.js +121 -242
- package/dist/server/services/providers-registry.js.map +1 -1
- package/dist/server/services/providers-registry.mjs +121 -239
- package/dist/server/services/providers-registry.mjs.map +1 -1
- package/dist/server/utils/oauth-connect/index.js +236 -0
- package/dist/server/utils/oauth-connect/index.js.map +1 -0
- package/dist/server/utils/oauth-connect/index.mjs +230 -0
- package/dist/server/utils/oauth-connect/index.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.js +138 -0
- package/dist/server/utils/oauth-connect/oauth1.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs +136 -0
- package/dist/server/utils/oauth-connect/oauth1.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.js +117 -0
- package/dist/server/utils/oauth-connect/oauth2.js.map +1 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs +115 -0
- package/dist/server/utils/oauth-connect/oauth2.mjs.map +1 -0
- package/dist/server/utils/oauth-connect/providers.js +109 -0
- package/dist/server/utils/oauth-connect/providers.js.map +1 -0
- package/dist/server/utils/oauth-connect/providers.mjs +107 -0
- package/dist/server/utils/oauth-connect/providers.mjs.map +1 -0
- package/dist/server/utils/provider-http.js +52 -0
- package/dist/server/utils/provider-http.js.map +1 -0
- package/dist/server/utils/provider-http.mjs +50 -0
- package/dist/server/utils/provider-http.mjs.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.js +60 -0
- package/dist/server/utils/verify-jwt-with-jwks.js.map +1 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs +54 -0
- package/dist/server/utils/verify-jwt-with-jwks.mjs.map +1 -0
- package/jsconfig.json +7 -0
- package/package.json +12 -12
- package/server/controllers/auth.js +13 -20
- package/server/services/providers-registry.js +137 -293
- package/server/utils/oauth-connect/index.js +256 -0
- package/server/utils/oauth-connect/oauth1.js +169 -0
- package/server/utils/oauth-connect/oauth2.js +123 -0
- package/server/utils/oauth-connect/providers.js +100 -0
- package/server/utils/provider-http.js +49 -0
- package/server/utils/verify-jwt-with-jwks.js +43 -0
|
@@ -1,52 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const { strict: assert } = require('assert');
|
|
4
|
-
const jwt = require('jsonwebtoken');
|
|
5
4
|
const urljoin = require('url-join');
|
|
6
|
-
const jwkToPem = require('jwk-to-pem');
|
|
7
5
|
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
header: { kid },
|
|
11
|
-
payload,
|
|
12
|
-
} = jwt.decode(idToken, { complete: true });
|
|
6
|
+
const { verifyJwtWithJwks } = require('../utils/verify-jwt-with-jwks');
|
|
7
|
+
const { bearerGet, fetchJson } = require('../utils/provider-http');
|
|
13
8
|
|
|
14
|
-
|
|
15
|
-
throw new Error('The provided token is not valid');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const config = {
|
|
19
|
-
cognito: {
|
|
20
|
-
discovery: {
|
|
21
|
-
origin: jwksUrl.origin,
|
|
22
|
-
path: jwksUrl.pathname,
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
try {
|
|
27
|
-
const cognito = purest({ provider: 'cognito', config });
|
|
28
|
-
// get the JSON Web Key (JWK) for the user pool
|
|
29
|
-
const { body: jwk } = await cognito('discovery').request();
|
|
30
|
-
// Get the key with the same Key ID as the provided token
|
|
31
|
-
const key = jwk.keys.find(({ kid: jwkKid }) => jwkKid === kid);
|
|
32
|
-
const pem = jwkToPem(key);
|
|
33
|
-
|
|
34
|
-
// https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html
|
|
35
|
-
const decodedToken = await new Promise((resolve, reject) => {
|
|
36
|
-
jwt.verify(idToken, pem, { algorithms: ['RS256'] }, (err, decodedToken) => {
|
|
37
|
-
if (err) {
|
|
38
|
-
reject();
|
|
39
|
-
}
|
|
40
|
-
resolve(decodedToken);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
return decodedToken;
|
|
44
|
-
} catch (err) {
|
|
45
|
-
throw new Error('There was an error verifying the token');
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const initProviders = ({ baseURL, purest }) => ({
|
|
9
|
+
const initProviders = ({ baseURL }) => ({
|
|
50
10
|
email: {
|
|
51
11
|
enabled: true,
|
|
52
12
|
icon: 'envelope',
|
|
@@ -62,23 +22,15 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
62
22
|
scope: ['identify', 'email'],
|
|
63
23
|
},
|
|
64
24
|
async authCallback({ accessToken }) {
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
body.discriminator && body.discriminator !== '0'
|
|
75
|
-
? `${body.username}#${body.discriminator}`
|
|
76
|
-
: body.username;
|
|
77
|
-
return {
|
|
78
|
-
username,
|
|
79
|
-
email: body.email,
|
|
80
|
-
};
|
|
81
|
-
});
|
|
25
|
+
const { body } = await bearerGet('https://discord.com/api/users/@me', accessToken);
|
|
26
|
+
const username =
|
|
27
|
+
body.discriminator && body.discriminator !== '0'
|
|
28
|
+
? `${body.username}#${body.discriminator}`
|
|
29
|
+
: body.username;
|
|
30
|
+
return {
|
|
31
|
+
username,
|
|
32
|
+
email: body.email,
|
|
33
|
+
};
|
|
82
34
|
},
|
|
83
35
|
},
|
|
84
36
|
facebook: {
|
|
@@ -91,17 +43,13 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
91
43
|
scope: ['email'],
|
|
92
44
|
},
|
|
93
45
|
async authCallback({ accessToken }) {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
.then(({ body }) => ({
|
|
102
|
-
username: body.name,
|
|
103
|
-
email: body.email,
|
|
104
|
-
}));
|
|
46
|
+
const { body } = await bearerGet('https://graph.facebook.com/me', accessToken, {
|
|
47
|
+
qs: { fields: 'name,email' },
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
username: body.name,
|
|
51
|
+
email: body.email,
|
|
52
|
+
};
|
|
105
53
|
},
|
|
106
54
|
},
|
|
107
55
|
google: {
|
|
@@ -114,17 +62,13 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
114
62
|
scope: ['email'],
|
|
115
63
|
},
|
|
116
64
|
async authCallback({ accessToken }) {
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.
|
|
122
|
-
.
|
|
123
|
-
|
|
124
|
-
.then(({ body }) => ({
|
|
125
|
-
username: body.email.split('@')[0],
|
|
126
|
-
email: body.email,
|
|
127
|
-
}));
|
|
65
|
+
const { body } = await fetchJson(
|
|
66
|
+
`https://oauth2.googleapis.com/tokeninfo?access_token=${encodeURIComponent(accessToken)}`
|
|
67
|
+
);
|
|
68
|
+
return {
|
|
69
|
+
username: body.email.split('@')[0],
|
|
70
|
+
email: body.email,
|
|
71
|
+
};
|
|
128
72
|
},
|
|
129
73
|
},
|
|
130
74
|
github: {
|
|
@@ -137,26 +81,24 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
137
81
|
scope: ['user', 'user:email'],
|
|
138
82
|
},
|
|
139
83
|
async authCallback({ accessToken }) {
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
defaults: {
|
|
143
|
-
headers: {
|
|
144
|
-
'user-agent': 'strapi',
|
|
145
|
-
},
|
|
146
|
-
},
|
|
84
|
+
const { body: userBody } = await bearerGet('https://api.github.com/user', accessToken, {
|
|
85
|
+
headers: { 'user-agent': 'strapi' },
|
|
147
86
|
});
|
|
148
87
|
|
|
149
|
-
const { body: userBody } = await github.get('user').auth(accessToken).request();
|
|
150
|
-
|
|
151
|
-
// This is the public email on the github profile
|
|
152
88
|
if (userBody.email) {
|
|
153
89
|
return {
|
|
154
90
|
username: userBody.login,
|
|
155
91
|
email: userBody.email,
|
|
156
92
|
};
|
|
157
93
|
}
|
|
158
|
-
|
|
159
|
-
const { body: emailBody } = await
|
|
94
|
+
|
|
95
|
+
const { body: emailBody } = await bearerGet(
|
|
96
|
+
'https://api.github.com/user/emails',
|
|
97
|
+
accessToken,
|
|
98
|
+
{
|
|
99
|
+
headers: { 'user-agent': 'strapi' },
|
|
100
|
+
}
|
|
101
|
+
);
|
|
160
102
|
|
|
161
103
|
return {
|
|
162
104
|
username: userBody.login,
|
|
@@ -176,16 +118,11 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
176
118
|
scope: ['user.read'],
|
|
177
119
|
},
|
|
178
120
|
async authCallback({ accessToken }) {
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
.
|
|
183
|
-
|
|
184
|
-
.request()
|
|
185
|
-
.then(({ body }) => ({
|
|
186
|
-
username: body.userPrincipalName,
|
|
187
|
-
email: body.userPrincipalName,
|
|
188
|
-
}));
|
|
121
|
+
const { body } = await bearerGet('https://graph.microsoft.com/v1.0/me', accessToken);
|
|
122
|
+
return {
|
|
123
|
+
username: body.userPrincipalName,
|
|
124
|
+
email: body.userPrincipalName,
|
|
125
|
+
};
|
|
189
126
|
},
|
|
190
127
|
},
|
|
191
128
|
|
|
@@ -198,25 +135,20 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
198
135
|
callbackUrl: `${baseURL}/twitter/callback`,
|
|
199
136
|
},
|
|
200
137
|
async authCallback({ accessToken, query, providers }) {
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
},
|
|
138
|
+
const { twitterGet } = require('../utils/oauth-connect/oauth1');
|
|
139
|
+
const { body } = await twitterGet({
|
|
140
|
+
url: 'https://api.twitter.com/1.1/account/verify_credentials.json',
|
|
141
|
+
accessToken,
|
|
142
|
+
accessCredential: query.access_secret,
|
|
143
|
+
consumerKey: providers.twitter.key,
|
|
144
|
+
clientCredential: providers.twitter.secret,
|
|
145
|
+
qs: { include_email: 'true', screen_name: query['raw[screen_name]'] },
|
|
209
146
|
});
|
|
210
147
|
|
|
211
|
-
return
|
|
212
|
-
.
|
|
213
|
-
.
|
|
214
|
-
|
|
215
|
-
.request()
|
|
216
|
-
.then(({ body }) => ({
|
|
217
|
-
username: body.screen_name,
|
|
218
|
-
email: body.email,
|
|
219
|
-
}));
|
|
148
|
+
return {
|
|
149
|
+
username: body.screen_name,
|
|
150
|
+
email: body.email,
|
|
151
|
+
};
|
|
220
152
|
},
|
|
221
153
|
},
|
|
222
154
|
instagram: {
|
|
@@ -229,17 +161,13 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
229
161
|
scope: ['user_profile'],
|
|
230
162
|
},
|
|
231
163
|
async authCallback({ accessToken }) {
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
.then(({ body }) => ({
|
|
240
|
-
username: body.username,
|
|
241
|
-
email: `${body.username}@strapi.io`, // dummy email as Instagram does not provide user email
|
|
242
|
-
}));
|
|
164
|
+
const { body } = await bearerGet('https://graph.instagram.com/me', accessToken, {
|
|
165
|
+
qs: { fields: 'id,username' },
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
username: body.username,
|
|
169
|
+
email: `${body.username}@strapi.io`,
|
|
170
|
+
};
|
|
243
171
|
},
|
|
244
172
|
},
|
|
245
173
|
vk: {
|
|
@@ -252,17 +180,13 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
252
180
|
scope: ['email'],
|
|
253
181
|
},
|
|
254
182
|
async authCallback({ accessToken, query }) {
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
.then(({ body }) => ({
|
|
263
|
-
username: `${body.response[0].last_name} ${body.response[0].first_name}`,
|
|
264
|
-
email: query.raw.email,
|
|
265
|
-
}));
|
|
183
|
+
const { body } = await bearerGet('https://api.vk.com/method/users.get', accessToken, {
|
|
184
|
+
qs: { user_ids: query.raw.user_id, v: '5.122' },
|
|
185
|
+
});
|
|
186
|
+
return {
|
|
187
|
+
username: `${body.response[0].last_name} ${body.response[0].first_name}`,
|
|
188
|
+
email: query.raw.email,
|
|
189
|
+
};
|
|
266
190
|
},
|
|
267
191
|
},
|
|
268
192
|
|
|
@@ -276,30 +200,15 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
276
200
|
scope: ['user:read:email'],
|
|
277
201
|
},
|
|
278
202
|
async authCallback({ accessToken, providers }) {
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
twitch: {
|
|
283
|
-
default: {
|
|
284
|
-
origin: 'https://api.twitch.tv',
|
|
285
|
-
path: 'helix/{path}',
|
|
286
|
-
headers: {
|
|
287
|
-
Authorization: 'Bearer {auth}',
|
|
288
|
-
'Client-Id': '{auth}',
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
},
|
|
203
|
+
const { body } = await bearerGet('https://api.twitch.tv/helix/users', accessToken, {
|
|
204
|
+
headers: {
|
|
205
|
+
'Client-Id': providers.twitch.key,
|
|
292
206
|
},
|
|
293
207
|
});
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
.
|
|
297
|
-
|
|
298
|
-
.request()
|
|
299
|
-
.then(({ body }) => ({
|
|
300
|
-
username: body.data[0].login,
|
|
301
|
-
email: body.data[0].email,
|
|
302
|
-
}));
|
|
208
|
+
return {
|
|
209
|
+
username: body.data[0].login,
|
|
210
|
+
email: body.data[0].email,
|
|
211
|
+
};
|
|
303
212
|
},
|
|
304
213
|
},
|
|
305
214
|
|
|
@@ -313,21 +222,16 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
313
222
|
scope: ['r_liteprofile', 'r_emailaddress'],
|
|
314
223
|
},
|
|
315
224
|
async authCallback({ accessToken }) {
|
|
316
|
-
const
|
|
317
|
-
const {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
body: { elements },
|
|
322
|
-
} = await linkedIn
|
|
323
|
-
.get('emailAddress?q=members&projection=(elements*(handle~))')
|
|
324
|
-
.auth(accessToken)
|
|
325
|
-
.request();
|
|
225
|
+
const { body: profileBody } = await bearerGet('https://api.linkedin.com/v2/me', accessToken);
|
|
226
|
+
const { body: emailBody } = await bearerGet(
|
|
227
|
+
'https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))',
|
|
228
|
+
accessToken
|
|
229
|
+
);
|
|
326
230
|
|
|
327
|
-
const email = elements[0]['handle~'];
|
|
231
|
+
const email = emailBody.elements[0]['handle~'];
|
|
328
232
|
|
|
329
233
|
return {
|
|
330
|
-
username: localizedFirstName,
|
|
234
|
+
username: profileBody.localizedFirstName,
|
|
331
235
|
email: email.emailAddress,
|
|
332
236
|
};
|
|
333
237
|
},
|
|
@@ -346,7 +250,7 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
346
250
|
async authCallback({ query, providers }) {
|
|
347
251
|
const jwksUrl = new URL(providers.cognito.jwksurl);
|
|
348
252
|
const idToken = query.id_token;
|
|
349
|
-
const tokenPayload = await
|
|
253
|
+
const tokenPayload = await verifyJwtWithJwks({ idToken, jwksUrl });
|
|
350
254
|
return {
|
|
351
255
|
username: tokenPayload['cognito:username'],
|
|
352
256
|
email: tokenPayload.email,
|
|
@@ -364,31 +268,13 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
364
268
|
scope: ['identity'],
|
|
365
269
|
},
|
|
366
270
|
async authCallback({ accessToken }) {
|
|
367
|
-
const
|
|
368
|
-
|
|
369
|
-
config: {
|
|
370
|
-
reddit: {
|
|
371
|
-
default: {
|
|
372
|
-
origin: 'https://oauth.reddit.com',
|
|
373
|
-
path: 'api/{version}/{path}',
|
|
374
|
-
version: 'v1',
|
|
375
|
-
headers: {
|
|
376
|
-
Authorization: 'Bearer {auth}',
|
|
377
|
-
'user-agent': 'strapi',
|
|
378
|
-
},
|
|
379
|
-
},
|
|
380
|
-
},
|
|
381
|
-
},
|
|
271
|
+
const { body } = await bearerGet('https://oauth.reddit.com/api/v1/me', accessToken, {
|
|
272
|
+
headers: { 'user-agent': 'strapi' },
|
|
382
273
|
});
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
.
|
|
386
|
-
|
|
387
|
-
.request()
|
|
388
|
-
.then(({ body }) => ({
|
|
389
|
-
username: body.name,
|
|
390
|
-
email: `${body.name}@strapi.io`, // dummy email as Reddit does not provide user email
|
|
391
|
-
}));
|
|
274
|
+
return {
|
|
275
|
+
username: body.name,
|
|
276
|
+
email: `${body.name}@strapi.io`,
|
|
277
|
+
};
|
|
392
278
|
},
|
|
393
279
|
},
|
|
394
280
|
|
|
@@ -403,22 +289,17 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
403
289
|
scope: ['openid', 'email', 'profile'],
|
|
404
290
|
},
|
|
405
291
|
async authCallback({ accessToken, providers }) {
|
|
406
|
-
const
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
.request()
|
|
413
|
-
.then(({ body }) => {
|
|
414
|
-
const username = body.username || body.nickname || body.name || body.email.split('@')[0];
|
|
415
|
-
const email = body.email || `${username.replace(/\s+/g, '.')}@strapi.io`;
|
|
292
|
+
const { body } = await bearerGet(
|
|
293
|
+
`https://${providers.auth0.subdomain}.auth0.com/userinfo`,
|
|
294
|
+
accessToken
|
|
295
|
+
);
|
|
296
|
+
const username = body.username || body.nickname || body.name || body.email.split('@')[0];
|
|
297
|
+
const email = body.email || `${username.replace(/\s+/g, '.')}@strapi.io`;
|
|
416
298
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
});
|
|
299
|
+
return {
|
|
300
|
+
username,
|
|
301
|
+
email,
|
|
302
|
+
};
|
|
422
303
|
},
|
|
423
304
|
},
|
|
424
305
|
|
|
@@ -429,35 +310,29 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
429
310
|
key: '',
|
|
430
311
|
secret: '',
|
|
431
312
|
callback: `${baseURL}/cas/callback`,
|
|
432
|
-
scope: ['openid email'],
|
|
313
|
+
scope: ['openid email'],
|
|
433
314
|
subdomain: 'my.subdomain.com/cas',
|
|
434
315
|
},
|
|
435
316
|
async authCallback({ accessToken, providers }) {
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
.
|
|
442
|
-
.
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
}
|
|
456
|
-
return {
|
|
457
|
-
username,
|
|
458
|
-
email,
|
|
459
|
-
};
|
|
460
|
-
});
|
|
317
|
+
const { body } = await bearerGet(
|
|
318
|
+
`https://${providers.cas.subdomain}/oidc/profile`,
|
|
319
|
+
accessToken
|
|
320
|
+
);
|
|
321
|
+
const username = body.attributes
|
|
322
|
+
? body.attributes.strapiusername || body.id || body.sub
|
|
323
|
+
: body.strapiusername || body.id || body.sub;
|
|
324
|
+
const email = body.attributes
|
|
325
|
+
? body.attributes.strapiemail || body.attributes.email
|
|
326
|
+
: body.strapiemail || body.email;
|
|
327
|
+
if (!username || !email) {
|
|
328
|
+
strapi.log.warn(
|
|
329
|
+
`CAS Response Body did not contain required attributes: ${JSON.stringify(body)}`
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
username,
|
|
334
|
+
email,
|
|
335
|
+
};
|
|
461
336
|
},
|
|
462
337
|
},
|
|
463
338
|
|
|
@@ -471,33 +346,15 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
471
346
|
scope: ['identity', 'identity[email]'],
|
|
472
347
|
},
|
|
473
348
|
async authCallback({ accessToken }) {
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
},
|
|
484
|
-
},
|
|
485
|
-
},
|
|
486
|
-
},
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
return patreon
|
|
490
|
-
.get('v2/identity')
|
|
491
|
-
.auth(accessToken)
|
|
492
|
-
.qs(new URLSearchParams({ 'fields[user]': 'full_name,email' }).toString())
|
|
493
|
-
.request()
|
|
494
|
-
.then(({ body }) => {
|
|
495
|
-
const patreonData = body.data.attributes;
|
|
496
|
-
return {
|
|
497
|
-
username: patreonData.full_name,
|
|
498
|
-
email: patreonData.email,
|
|
499
|
-
};
|
|
500
|
-
});
|
|
349
|
+
const { body } = await bearerGet(
|
|
350
|
+
'https://www.patreon.com/api/oauth2/v2/identity?fields[user]=full_name,email',
|
|
351
|
+
accessToken
|
|
352
|
+
);
|
|
353
|
+
const patreonData = body.data.attributes;
|
|
354
|
+
return {
|
|
355
|
+
username: patreonData.full_name,
|
|
356
|
+
email: patreonData.email,
|
|
357
|
+
};
|
|
501
358
|
},
|
|
502
359
|
},
|
|
503
360
|
keycloak: {
|
|
@@ -511,34 +368,24 @@ const initProviders = ({ baseURL, purest }) => ({
|
|
|
511
368
|
scope: ['openid', 'email', 'profile'],
|
|
512
369
|
},
|
|
513
370
|
async authCallback({ accessToken, providers }) {
|
|
514
|
-
const
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
.
|
|
520
|
-
.
|
|
521
|
-
|
|
522
|
-
return {
|
|
523
|
-
username: body.preferred_username,
|
|
524
|
-
email: body.email,
|
|
525
|
-
};
|
|
526
|
-
});
|
|
371
|
+
const { body } = await bearerGet(
|
|
372
|
+
`https://${providers.keycloak.subdomain}/protocol/openid-connect/userinfo`,
|
|
373
|
+
accessToken
|
|
374
|
+
);
|
|
375
|
+
return {
|
|
376
|
+
username: body.preferred_username,
|
|
377
|
+
email: body.email,
|
|
378
|
+
};
|
|
527
379
|
},
|
|
528
380
|
},
|
|
529
381
|
});
|
|
530
382
|
|
|
531
383
|
module.exports = () => {
|
|
532
|
-
const purest = require('purest');
|
|
533
|
-
|
|
534
384
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
|
535
385
|
const baseURL = urljoin(strapi.config.server.url, apiPrefix, 'auth');
|
|
536
386
|
|
|
537
|
-
const authProviders = initProviders({ baseURL
|
|
387
|
+
const authProviders = initProviders({ baseURL });
|
|
538
388
|
|
|
539
|
-
/**
|
|
540
|
-
* @public
|
|
541
|
-
*/
|
|
542
389
|
return {
|
|
543
390
|
getAll() {
|
|
544
391
|
return authProviders;
|
|
@@ -553,15 +400,12 @@ module.exports = () => {
|
|
|
553
400
|
delete authProviders[name];
|
|
554
401
|
},
|
|
555
402
|
|
|
556
|
-
/**
|
|
557
|
-
* @internal
|
|
558
|
-
*/
|
|
559
403
|
async run({ provider, accessToken, query, providers }) {
|
|
560
404
|
const authProvider = authProviders[provider];
|
|
561
405
|
|
|
562
406
|
assert(authProvider, 'Unknown auth provider');
|
|
563
407
|
|
|
564
|
-
return authProvider.authCallback({ accessToken, query, providers
|
|
408
|
+
return authProvider.authCallback({ accessToken, query, providers });
|
|
565
409
|
},
|
|
566
410
|
};
|
|
567
411
|
};
|