269 lines
6.7 KiB
JavaScript
Raw Normal View History

2018-01-12 15:20:13 +01:00
'use strict';
/**
* Module dependencies.
*/
// Public node modules.
const _ = require('lodash');
const request = require('request');
2018-01-12 15:20:13 +01:00
2019-04-05 16:11:09 +02:00
// Purest strategies.<
2018-01-12 15:20:13 +01:00
const Purest = require('purest');
/**
* Connect thanks to a third-party provider.
*
*
* @param {String} provider
* @param {String} access_token
*
* @return {*}
*/
exports.connect = (provider, query) => {
const access_token = query.access_token || query.code || query.oauth_token;
2018-01-12 15:20:13 +01:00
return new Promise((resolve, reject) => {
if (!access_token) {
2018-01-25 11:53:22 +01:00
return reject(null, {
2018-01-12 15:20:13 +01:00
message: 'No access_token.'
});
}
2018-01-25 11:53:22 +01:00
// Get the profile.
getProfile(provider, query, async (err, profile) => {
if (err) {
return reject(err);
}
// We need at least the mail.
if (!profile.email) {
2018-01-25 12:26:09 +01:00
return reject([{
2018-01-25 11:53:22 +01:00
message: 'Email was not available.'
}, null]);
2018-01-25 13:43:07 +01:00
}
2018-01-25 12:26:09 +01:00
try {
2019-04-26 10:17:04 +02:00
const users = await strapi.plugins['users-permissions'].queries('user', 'users-permissions').find({
2019-01-11 22:52:28 +13:00
email: profile.email
2019-02-03 13:49:55 +01:00
});
2018-01-25 11:53:22 +01:00
const advanced = await strapi.store({
environment: '',
type: 'plugin',
name: 'users-permissions',
key: 'advanced'
}).get();
if (_.isEmpty(_.find(users, {provider})) && !advanced.allow_register) {
2018-01-25 12:26:09 +01:00
return resolve([null, [{ messages: [{ id: 'Auth.advanced.allow_register' }] }], 'Register action is actualy not available.']);
}
2018-01-25 11:53:22 +01:00
const user = _.find(users, {provider});
if (!_.isEmpty(user)) {
2018-01-25 15:48:56 +01:00
return resolve([user, null]);
2018-01-25 12:26:09 +01:00
}
2018-01-25 11:53:22 +01:00
if (!_.isEmpty(_.find(users, user => user.provider !== provider)) && advanced.unique_email) {
2018-01-25 12:26:09 +01:00
return resolve([null, [{ messages: [{ id: 'Auth.form.error.email.taken' }] }], 'Email is already taken.']);
}
2018-01-25 11:53:22 +01:00
// Retrieve default role.
2019-04-26 10:17:04 +02:00
const defaultRole = await strapi.plugins['users-permissions'].queries('role', 'users-permissions').findOne({ type: advanced.default_role }, []);
2018-01-29 17:12:49 +01:00
// Create the new user.
const params = _.assign(profile, {
provider: provider,
role: defaultRole._id || defaultRole.id
2018-01-29 17:12:49 +01:00
});
2018-01-25 11:53:22 +01:00
2019-04-26 10:17:04 +02:00
const createdUser = await strapi.plugins['users-permissions'].queries('user', 'users-permissions').create(params);
2018-01-25 11:53:22 +01:00
2018-01-29 17:12:49 +01:00
return resolve([createdUser, null]);
2018-01-25 12:26:09 +01:00
} catch (err) {
reject([null, err]);
2018-01-25 11:53:22 +01:00
}
});
2018-01-12 15:20:13 +01: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 grant = await strapi.store({
environment: '',
type: 'plugin',
name: 'users-permissions',
key: 'grant'
}).get();
2018-01-12 15:20:13 +01:00
switch (provider) {
case 'discord': {
const discord = new Purest({
provider: 'discord',
config: {
'discord': {
'https://discordapp.com/api/': {
'__domain': {
'auth': {
'auth': {'bearer': '[0]'}
}
},
'{endpoint}': {
'__path': {
'alias': '__default'
}
}
}
}
}
});
discord.query().get('users/@me').auth(access_token).request((err, res, body) => {
if (err) {
callback(err);
} else {
// Combine username and discriminator because discord username is not unique
2018-08-06 16:59:14 +02:00
var username = `${body.username}#${body.discriminator}`;
callback(null, {
username: username,
email: body.email
});
}
});
break;
}
case 'facebook': {
2018-01-25 15:04:42 +01:00
const facebook = new Purest({
provider: 'facebook'
});
2018-01-12 15:20:13 +01:00
facebook.query().get('me?fields=name,email').auth(access_token).request((err, res, body) => {
if (err) {
callback(err);
} else {
callback(null, {
username: body.name,
email: body.email
});
}
});
break;
}
case 'google': {
2018-01-25 15:04:42 +01:00
const google = new Purest({
provider: 'google'
});
2018-01-12 15:20:13 +01:00
google.query('plus').get('people/me').auth(access_token).request((err, res, body) => {
if (err) {
callback(err);
} else {
callback(null, {
username: body.emails[0].value.split("@")[0],
2018-01-12 15:20:13 +01:00
email: body.emails[0].value
});
}
});
break;
}
case 'github': {
2018-01-25 15:04:42 +01:00
const github = new Purest({
provider: 'github',
defaults: {
headers: {
'user-agent': 'strapi'
}
}
});
request.post({
url: 'https://github.com/login/oauth/access_token',
form: {
client_id: grant.github.key,
client_secret: grant.github.secret,
code: access_token
2018-01-12 15:20:13 +01:00
}
}, (err, res, body) => {
github.query().get('user').auth(body.split('&')[0].split('=')[1]).request((err, res, body) => {
if (err) {
callback(err);
} else {
callback(null, {
username: body.login,
email: body.email
});
}
});
2018-01-12 15:20:13 +01:00
});
break;
}
case 'microsoft': {
const microsoft = new Purest({
provider: 'microsoft',
config:{
'microsoft': {
'https://graph.microsoft.com': {
'__domain': {
'auth': {
'auth': {'bearer': '[0]'}
}
},
'[version]/{endpoint}': {
'__path': {
'alias': '__default',
'version': 'v1.0'
}
}
}
}
}
});
microsoft.query().get('me').auth(access_token).request((err, res, body) => {
if (err) {
callback(err);
} else {
callback(null, {
username: body.userPrincipalName,
email: body.userPrincipalName
});
}
});
break;
}
case 'twitter': {
2018-01-25 15:04:42 +01:00
const twitter = new Purest({
provider: 'twitter',
key: grant.twitter.key,
secret: grant.twitter.secret
2018-01-25 15:04:42 +01:00
});
twitter.query().get('account/verify_credentials').auth(access_token, query.access_secret).qs({screen_name: query['raw[screen_name]'], include_email: 'true'}).request((err, res, body) => {
2018-01-12 15:20:13 +01:00
if (err) {
callback(err);
} else {
callback(null, {
username: body.screen_name,
email: body.email
2018-01-12 15:20:13 +01:00
});
}
});
break;
}
2018-01-12 15:20:13 +01:00
default:
callback({
message: 'Unknown provider.'
});
break;
}
};