Add google provider connect fix

This commit is contained in:
julien vdb
2025-02-17 10:59:30 +01:00
parent 472dc334a1
commit 9d4ecb2733
2 changed files with 99 additions and 1 deletions

View File

@@ -6,7 +6,7 @@ env:
DOCKER_IMAGE_NAME: harmony-back DOCKER_IMAGE_NAME: harmony-back
DOCKER_REGISTRY_URL: git.harmonylab.ovh DOCKER_REGISTRY_URL: git.harmonylab.ovh
DOCKER_REGISTRY_ORG: harmony DOCKER_REGISTRY_ORG: harmony
RELEASE_VERSION: 1.2 RELEASE_VERSION: 1.2.0
jobs: jobs:
build_docker_images: build_docker_images:

View 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;
};