Add google provider connect fix
This commit is contained in:
98
src/extensions/users-permissions/strapi-server.ts
Normal file
98
src/extensions/users-permissions/strapi-server.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
"use strict";
|
||||
const lod = require("lodash");
|
||||
module.exports = (plugin) => {
|
||||
const rawProviders = plugin.services.providers({ strapi });
|
||||
|
||||
const getService = (name) => {
|
||||
return strapi.plugin("users-permissions").service(name);
|
||||
};
|
||||
|
||||
const getProfile = async (provider, query) => {
|
||||
const accessToken = query.access_token || query.code || query.oauth_token;
|
||||
|
||||
const providers = await strapi
|
||||
.store({ type: "plugin", name: "users-permissions", key: "grant" })
|
||||
.get();
|
||||
|
||||
return getService("providers-registry").run({
|
||||
provider,
|
||||
query,
|
||||
accessToken,
|
||||
providers,
|
||||
});
|
||||
};
|
||||
|
||||
const providers = ({ strapi }) => {
|
||||
return {
|
||||
...rawProviders,
|
||||
connect: async (provider, query) => {
|
||||
const accessToken =
|
||||
query.access_token || query.code || query.oauth_token;
|
||||
|
||||
if (!accessToken) {
|
||||
throw new Error("No access_token.");
|
||||
}
|
||||
|
||||
// Get the profile.
|
||||
const profile = await getProfile(provider, query);
|
||||
|
||||
const email = lod.toLower(profile.email);
|
||||
|
||||
// We need at least the mail.
|
||||
if (!email) {
|
||||
throw new Error("Email was not available.");
|
||||
}
|
||||
|
||||
const users = await strapi.db
|
||||
.query("plugin::users-permissions.user")
|
||||
.findMany({
|
||||
where: { email },
|
||||
});
|
||||
|
||||
const advancedSettings = await strapi
|
||||
.store({ type: "plugin", name: "users-permissions", key: "advanced" })
|
||||
.get();
|
||||
|
||||
let user = lod.find(users, { provider });
|
||||
if (lod.isEmpty(user)) {
|
||||
user = lod.find(users);
|
||||
}
|
||||
|
||||
if (lod.isEmpty(user) && !advancedSettings.allow_register) {
|
||||
throw new Error("Register action is actually not available.");
|
||||
}
|
||||
|
||||
if (!lod.isEmpty(user)) {
|
||||
return user;
|
||||
}
|
||||
|
||||
if (users.length && advancedSettings.unique_email) {
|
||||
throw new Error("Email is already taken.");
|
||||
}
|
||||
|
||||
// Retrieve default role.
|
||||
const defaultRole = await strapi.db
|
||||
.query("plugin::users-permissions.role")
|
||||
.findOne({ where: { type: advancedSettings.default_role } });
|
||||
|
||||
// Create the new user.
|
||||
const newUser = {
|
||||
...profile,
|
||||
email, // overwrite with lowercased email
|
||||
provider,
|
||||
role: defaultRole.id,
|
||||
confirmed: true,
|
||||
};
|
||||
|
||||
const createdUser = await strapi.db
|
||||
.query("plugin::users-permissions.user")
|
||||
.create({ data: newUser });
|
||||
|
||||
return createdUser;
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
plugin.services.providers = providers;
|
||||
return plugin;
|
||||
};
|
||||
Reference in New Issue
Block a user