这已经有一段时间了,没有人回复,所以我会发布我的解决方法,以防它帮助下一个人。如果有人提出更好的选择,我不会接受我自己的答案:
我在会话中修改了我的商店以使用自定义 genid 函数;默认情况下,express 会话配置似乎只是创建了一个带有 uid 的记录。您可以通过设置genid 属性为会话生成自己的uid。
{
// ...
genid: (req) => {
// 37 chars long total
// 32 characters (base 64, so 24) random, plus we want to note the authentication method for use later. 'APPL'/'PASS'/'GOOG'
const uuid = uid.sync(24); // use UUIDs for session IDs
const route = (req?.url?.split('/') ?? [undefined]).pop();
let str = uuid;
switch (route) {
case 'apple':
str = 'APPL+' + uuid;
break;
case 'google':
str = 'GOOG+' + uuid;
break;
default:
str = 'PASS+' + uuid;
break;
}
// console.log(str);
return str;
},
// ...
}
基本原则是我会使用请求对象来确定用户连接到的服务器端点。然后,我会在生成的 uid 的前面插入一个 4 位标识符代码,并以“+”作为分隔符。然后,只需查看会话,您就知道使用了哪个身份验证提供程序。
我的路由器是这样的:
// Login
router.post('/login',
passport.authenticate('local', {
failureRedirect: '/auth/failure',
}),
controller.success
);
router.post('/login/apple',
passport.authenticate('apple', {
failureRedirect: '/auth/failure',
}),
controller.success
);
router.post('/login/google',
passport.authenticate('google', {
failureRedirect: '/auth/failure',
}),
controller.success
);