2024-09-24 17:24:32 -04:00
|
|
|
var OAuth2Strategy = require('passport-oauth2')
|
2024-10-01 00:14:55 -04:00
|
|
|
var authUserAssoc = require('../../../models/authUserAssociation')
|
|
|
|
|
var users = require('../../../models/users')
|
|
|
|
|
var {hasNestedValue} = require('../../../utils')
|
|
|
|
|
|
2024-09-24 17:24:32 -04:00
|
|
|
|
2024-09-27 23:02:53 -04:00
|
|
|
class PassportOAuth {
|
2024-10-01 00:14:55 -04:00
|
|
|
constructor(passportjs,auth_id){
|
|
|
|
|
this.passportjs = passportjs
|
|
|
|
|
this.auth_id = auth_id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateUser(userinfos){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-28 17:08:11 -04:00
|
|
|
register(app, passport,endpoint, name, provider) {
|
2024-09-29 18:39:24 -04:00
|
|
|
const cb_url =`${process.env['BACKEND_URL']}${endpoint}/${name}/callback`
|
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
|
|
|
|
|
},
|
|
|
|
|
async function(req, accessToken, refreshToken, params, profile, done) {
|
2024-09-24 17:24:32 -04:00
|
|
|
try {
|
2024-09-28 17:08:11 -04:00
|
|
|
const userInfoResponse = await fetch(provider.OAUTH_USERINFO_URL, {
|
2024-09-27 23:02:53 -04:00
|
|
|
headers: { 'Authorization': `Bearer ${accessToken}` }
|
|
|
|
|
});
|
|
|
|
|
const userInfo = await userInfoResponse.json();
|
|
|
|
|
|
2024-10-01 00:14:55 -04:00
|
|
|
let received_user = {
|
2024-09-27 23:02:53 -04:00
|
|
|
email: userInfo.email,
|
|
|
|
|
name: userInfo.name,
|
2024-10-01 00:14:55 -04:00
|
|
|
roles: []
|
2024-09-27 23:02:53 -04:00
|
|
|
};
|
2024-10-01 00:14:55 -04:00
|
|
|
if(hasNestedValue(userInfo,provider.OIDC_ROLE_TEACHER_VALUE)) received_user.roles.push('teacher')
|
|
|
|
|
if(hasNestedValue(userInfo,provider.OIDC_ROLE_STUDENT_VALUE)) received_user.roles.push('student')
|
|
|
|
|
|
|
|
|
|
const user_association = await authUserAssoc.find_user_association(userInfo.sub)
|
|
|
|
|
|
|
|
|
|
if(user_linked){
|
|
|
|
|
let user = await users.getById(user_association.user_id)
|
|
|
|
|
user.name = received_user.name
|
|
|
|
|
user.email = received_user.email
|
|
|
|
|
user.roles = received_user.roles
|
|
|
|
|
users.editUser(user)
|
|
|
|
|
this.passportjs.authenticate(user)
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
let user_id = await users.getId(userInfo.email)
|
|
|
|
|
if(!user_id){
|
|
|
|
|
await users.register(received_user.email,"");
|
|
|
|
|
users.editUser
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-27 23:02:53 -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-09-27 23:02:53 -04:00
|
|
|
return done(null, user);
|
2024-09-24 17:24:32 -04:00
|
|
|
} catch (error) {
|
2024-09-28 17:08:11 -04:00
|
|
|
console.error(`Erreur dans la strategie OAuth2 '${name}' : ${error}`);
|
2024-09-24 17:24:32 -04:00
|
|
|
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-09-28 17:08:11 -04:00
|
|
|
scope: 'openid profile email offline_access'+ ` ${provider.OAUTH_ADD_SCOPE}`,
|
2024-09-27 23:02:53 -04:00
|
|
|
prompt: 'consent'
|
|
|
|
|
})(req, res, next);
|
|
|
|
|
});
|
2024-09-24 17:24:32 -04:00
|
|
|
|
2024-09-28 17:08:11 -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) {
|
|
|
|
|
res.json(req.user)
|
2024-10-01 00:14:55 -04:00
|
|
|
|
2024-09-30 23:05:00 -04:00
|
|
|
//const redirectUrl = `http://your-frontend-url.com/oauth/callback?user=${encodeURIComponent(req.user)}`;
|
|
|
|
|
//res.redirect(redirectUrl);
|
2024-09-28 17:08:11 -04:00
|
|
|
console.info(`L'utilisateur '${req.user.name}' vient de se connecter`)
|
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-09-27 23:02:53 -04:00
|
|
|
|
2024-09-29 18:39:24 -04:00
|
|
|
module.exports = PassportOAuth;
|