2018-01-12 15:20:13 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Module dependencies.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Public node modules.
|
|
|
|
const _ = require('lodash');
|
2021-11-29 10:41:26 +01:00
|
|
|
const urlJoin = require('url-join');
|
2018-01-12 15:20:13 +01:00
|
|
|
|
2021-04-29 13:51:12 +02:00
|
|
|
const { getAbsoluteServerUrl } = require('@strapi/utils');
|
2018-01-12 15:20:13 +01:00
|
|
|
|
2021-08-20 15:23:02 +02:00
|
|
|
module.exports = ({ strapi }) => {
|
2021-09-03 11:11:37 +02:00
|
|
|
// lazy load heavy dependencies
|
2022-01-13 16:17:04 +01:00
|
|
|
const providerRequest = require('./providers-list');
|
2021-09-03 11:11:37 +02:00
|
|
|
|
2021-08-20 15:23:02 +02:00
|
|
|
/**
|
|
|
|
* Helper to get profiles
|
|
|
|
*
|
|
|
|
* @param {String} provider
|
|
|
|
* @param {Function} callback
|
|
|
|
*/
|
|
|
|
|
|
|
|
const getProfile = async (provider, query, callback) => {
|
|
|
|
const access_token = query.access_token || query.code || query.oauth_token;
|
|
|
|
|
2021-11-29 16:05:45 +01:00
|
|
|
const providers = await strapi
|
2021-09-13 12:03:12 +02:00
|
|
|
.store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
|
2021-08-20 15:23:02 +02:00
|
|
|
.get();
|
|
|
|
|
2022-01-13 16:17:04 +01:00
|
|
|
await providerRequest({ provider, query, callback, access_token, providers });
|
2021-08-20 15:23:02 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Connect thanks to a third-party provider.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param {String} provider
|
|
|
|
* @param {String} access_token
|
|
|
|
*
|
|
|
|
* @return {*}
|
|
|
|
*/
|
|
|
|
|
|
|
|
const connect = (provider, query) => {
|
|
|
|
const access_token = query.access_token || query.code || query.oauth_token;
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
if (!access_token) {
|
|
|
|
return reject([null, { message: 'No access_token.' }]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the profile.
|
|
|
|
getProfile(provider, query, async (err, profile) => {
|
|
|
|
if (err) {
|
|
|
|
return reject([null, err]);
|
|
|
|
}
|
|
|
|
|
2021-09-29 12:04:42 +02:00
|
|
|
const email = _.toLower(profile.email);
|
|
|
|
|
2021-08-20 15:23:02 +02:00
|
|
|
// We need at least the mail.
|
2021-09-29 12:04:42 +02:00
|
|
|
if (!email) {
|
2021-08-20 15:23:02 +02:00
|
|
|
return reject([null, { message: 'Email was not available.' }]);
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const users = await strapi.query('plugin::users-permissions.user').findMany({
|
2021-09-29 12:04:42 +02:00
|
|
|
where: { email },
|
2021-08-20 15:23:02 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
const advanced = await strapi
|
2021-09-13 12:03:12 +02:00
|
|
|
.store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
|
2021-08-20 15:23:02 +02:00
|
|
|
.get();
|
|
|
|
|
|
|
|
const user = _.find(users, { provider });
|
|
|
|
|
|
|
|
if (_.isEmpty(user) && !advanced.allow_register) {
|
|
|
|
return resolve([
|
|
|
|
null,
|
|
|
|
[{ messages: [{ id: 'Auth.advanced.allow_register' }] }],
|
|
|
|
'Register action is actually not available.',
|
|
|
|
]);
|
|
|
|
}
|
2020-07-22 15:30:17 +02:00
|
|
|
|
2021-08-20 15:23:02 +02:00
|
|
|
if (!_.isEmpty(user)) {
|
|
|
|
return resolve([user, null]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
2021-11-29 16:05:45 +01:00
|
|
|
!_.isEmpty(_.find(users, user => user.provider !== provider)) &&
|
2021-08-20 15:23:02 +02:00
|
|
|
advanced.unique_email
|
|
|
|
) {
|
|
|
|
return resolve([
|
|
|
|
null,
|
|
|
|
[{ messages: [{ id: 'Auth.form.error.email.taken' }] }],
|
|
|
|
'Email is already taken.',
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Retrieve default role.
|
|
|
|
const defaultRole = await strapi
|
|
|
|
.query('plugin::users-permissions.role')
|
|
|
|
.findOne({ where: { type: advanced.default_role } });
|
|
|
|
|
|
|
|
// Create the new user.
|
2021-09-29 12:04:42 +02:00
|
|
|
const params = {
|
|
|
|
...profile,
|
|
|
|
email, // overwrite with lowercased email
|
2021-09-13 12:03:12 +02:00
|
|
|
provider,
|
2021-08-20 15:23:02 +02:00
|
|
|
role: defaultRole.id,
|
|
|
|
confirmed: true,
|
2021-09-29 12:04:42 +02:00
|
|
|
};
|
2021-08-20 15:23:02 +02:00
|
|
|
|
|
|
|
const createdUser = await strapi
|
|
|
|
.query('plugin::users-permissions.user')
|
|
|
|
.create({ data: params });
|
2020-07-22 15:30:17 +02:00
|
|
|
|
2021-08-20 15:23:02 +02:00
|
|
|
return resolve([createdUser, null]);
|
|
|
|
} catch (err) {
|
|
|
|
reject([null, err]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-10-26 16:51:29 +02:00
|
|
|
const buildRedirectUri = (provider = '') => {
|
|
|
|
const apiPrefix = strapi.config.get('api.rest.prefix');
|
2021-11-29 10:41:26 +01:00
|
|
|
return urlJoin(getAbsoluteServerUrl(strapi.config), apiPrefix, 'connect', provider, 'callback');
|
2021-10-26 16:51:29 +02:00
|
|
|
};
|
2021-08-20 15:23:02 +02:00
|
|
|
|
|
|
|
return {
|
|
|
|
connect,
|
|
|
|
buildRedirectUri,
|
|
|
|
};
|
|
|
|
};
|