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