135 lines
3.5 KiB
JavaScript
Raw Normal View History

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
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;
const providers = await strapi
.store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
2021-08-20 15:23:02 +02:00
.get();
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]);
}
const email = _.toLower(profile.email);
2021-08-20 15:23:02 +02:00
// We need at least the mail.
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({
where: { email },
2021-08-20 15:23:02 +02:00
});
const advanced = await strapi
.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.',
]);
}
2021-08-20 15:23:02 +02:00
if (!_.isEmpty(user)) {
return resolve([user, null]);
}
if (
!_.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.
const params = {
...profile,
email, // overwrite with lowercased email
provider,
2021-08-20 15:23:02 +02:00
role: defaultRole.id,
confirmed: true,
};
2021-08-20 15:23:02 +02:00
const createdUser = await strapi
.query('plugin::users-permissions.user')
.create({ data: params });
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,
};
};