Support for multiple Auth Providers

i found solution for strapi 4 using passwordless and providers like google and facebook :

file:/node_modules/@strapi/plugin-users-permissions/server/controllers/auth.js

if (provider === ‘local’) {

}else {

try {

let user = await getService(‘providers’).connect(provider, ctx.query);

// Check if the user exists based on email

const existingUser = await strapi

.query(‘plugin::users-permissions.user’)

.findOne({ where: { email: user.email } });

if (existingUser) {

// Check if the existing user is linked to another provider

if (existingUser.provider !== provider) {

// Link accounts

try{user = await strapi.query(‘plugin::users-permissions.user’).update({data:{ provider},where:{ id: existingUser.id}}

)}catch(e){console.log(“error updating”,e)}

}

}

if (user.blocked) {

throw new ForbiddenError(‘Your account has been blocked by an administrator’);

}

return ctx.send({

jwt: getService(‘jwt’).issue({ id: user.id }),

user: await sanitizeUser(user, ctx),

});

} catch (error) {

throw new ApplicationError(error.message);

}

}

file:/node_modules/@strapi/plugin-users-permissions/server/services/providers.js

@@ -67,8 +67,15 @@ module.exports = ({ strapi }) => {

const advancedSettings = await strapi

.store({ type: ‘plugin’, name: ‘users-permissions’, key: ‘advanced’ })

.get();
//change this
//const user = _.find(users, { provider });
//with this
let user = .find(users, { provider });
if(
.isEmpty(user)){
user = _.find(users);
}

if (_.isEmpty(user) && !advancedSettings.allow_register) {

throw new Error(‘Register action is actually not available.’);

use patch-package to save the changes.

hope it works for you

1 Like