EvalueTonSavoir/server/auth/modules/passport-providers/oauth.js

102 lines
4.1 KiB
JavaScript
Raw Normal View History

2024-09-24 17:24:32 -04:00
var OAuth2Strategy = require('passport-oauth2')
var authUserAssoc = require('../../../models/authUserAssociation')
var users = require('../../../models/users')
var { hasNestedValue } = require('../../../utils')
2024-10-01 12:03:49 -04:00
var jwt = require('../../../middleware/jwtToken')
2024-09-24 17:24:32 -04:00
2024-09-27 23:02:53 -04:00
class PassportOAuth {
2024-10-19 13:13:16 -04:00
constructor(passportjs, auth_name) {
this.passportjs = passportjs
this.auth_name = auth_name
}
2024-10-19 13:13:16 -04:00
register(app, passport, endpoint, name, provider) {
const cb_url = `${process.env['BACKEND_URL']}${endpoint}/${name}/callback`
const self = this
2024-10-22 13:04:29 -04:00
const scope = 'openid profile email offline_access' + ` ${provider.OAUTH_ADD_SCOPE}`;
2024-09-24 17:24:32 -04:00
passport.use(name, new OAuth2Strategy({
2024-09-28 17:08:11 -04:00
authorizationURL: provider.OAUTH_AUTHORIZATION_URL,
tokenURL: provider.OAUTH_TOKEN_URL,
clientID: provider.OAUTH_CLIENT_ID,
clientSecret: provider.OAUTH_CLIENT_SECRET,
2024-09-29 18:39:24 -04:00
callbackURL: cb_url,
2024-09-27 23:02:53 -04:00
passReqToCallback: true
},
2024-10-19 13:13:16 -04:00
async function (req, accessToken, refreshToken, params, profile, done) {
try {
const userInfoResponse = await fetch(provider.OAUTH_USERINFO_URL, {
headers: { 'Authorization': `Bearer ${accessToken}` }
});
const userInfo = await userInfoResponse.json();
2024-09-27 23:02:53 -04:00
2024-10-19 13:13:16 -04:00
let received_user = {
auth_id: userInfo.sub,
email: userInfo.email,
name: userInfo.name,
roles: []
};
2024-10-19 13:13:16 -04:00
if (hasNestedValue(userInfo, provider.OAUTH_ROLE_TEACHER_VALUE)) received_user.roles.push('teacher')
if (hasNestedValue(userInfo, provider.OAUTH_ROLE_STUDENT_VALUE)) received_user.roles.push('student')
2024-10-19 13:13:16 -04:00
const user_association = await authUserAssoc.find_user_association(self.auth_name, received_user.auth_id)
let user_account
if (user_association) {
user_account = await users.getById(user_association.user_id)
}
else {
let user_id = await users.getId(received_user.email)
if (user_id) {
user_account = await users.getById(user_id);
} else {
received_user.password = users.generatePassword()
user_account = await self.passportjs.register(received_user)
}
await authUserAssoc.link(self.auth_name, received_user.auth_id, user_account._id)
2024-10-08 15:45:18 -04:00
}
2024-09-27 23:02:53 -04:00
2024-10-19 13:13:16 -04:00
user_account.name = received_user.name
user_account.roles = received_user.roles
await users.editUser(user_account)
2024-10-19 13:13:16 -04:00
// Store the tokens in the session
req.session.oauth2Tokens = {
accessToken: accessToken,
refreshToken: refreshToken,
expiresIn: params.expires_in
};
2024-09-24 17:24:32 -04:00
2024-10-19 13:13:16 -04:00
return done(null, user_account);
} catch (error) {
console.error(`Erreur dans la strategie OAuth2 '${name}' : ${error}`);
return done(error);
}
}));
2024-09-27 23:02:53 -04:00
2024-09-28 17:08:11 -04:00
app.get(`${endpoint}/${name}`, (req, res, next) => {
2024-09-27 23:02:53 -04:00
passport.authenticate(name, {
2024-10-22 13:04:29 -04:00
scope: scope,
2024-09-27 23:02:53 -04:00
prompt: 'consent'
})(req, res, next);
});
2024-09-24 17:24:32 -04:00
2024-10-19 13:13:16 -04:00
app.get(`${endpoint}/${name}/callback`,
2024-09-27 23:02:53 -04:00
(req, res, next) => {
passport.authenticate(name, { failureRedirect: '/login' })(req, res, next);
},
(req, res) => {
if (req.user) {
2024-10-19 13:13:16 -04:00
self.passportjs.authenticate(req.user, req, res)
2024-09-27 23:02:53 -04:00
} else {
2024-09-28 17:08:11 -04:00
res.status(401).json({ error: "L'authentification a échoué" });
2024-09-27 23:02:53 -04:00
}
2024-09-24 17:24:32 -04:00
}
);
2024-10-22 13:04:29 -04:00
console.info(`Ajout de la connexion : ${name}(OAuth)`)
2024-09-24 17:24:32 -04:00
}
}
2024-09-27 23:02:53 -04:00
2024-09-29 18:39:24 -04:00
module.exports = PassportOAuth;