【问题标题】:How to store passport strategy used in session?如何存储会话中使用的护照策略?
【发布时间】:2021-10-26 04:17:00
【问题描述】:

我有一个使用本地和苹果策略的网络应用程序。

我想存储用户用于登录的护照“策略”类型。这样,当他们返回站点并加载会话时,我可以与第 3 方身份验证器(即 Apple)核实,以确保他们的会话没有被撤销。

我知道我可能会在我的用户表中跟踪此类内容,但我正在寻找一种与会话而非用户帐户相关联的方法,因为用户可能有多个会话(跨多个设备)。

我将Node.jsExpressPassport.js 一起使用。对于我的会话存储,我使用的是connect-mssql-v2

【问题讨论】:

    标签: node.js express session passport.js


    【解决方案1】:

    这已经有一段时间了,没有人回复,所以我会发布我的解决方法,以防它帮助下一个人。如果有人提出更好的选择,我不会接受我自己的答案:

    我在会话中修改了我的商店以使用自定义 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
    );
    

    【讨论】:

    • 希望这对下一个人有帮助;如果有任何问题,请随时询问。祝你好运?
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2016-05-23
    • 2015-06-17
    相关资源
    最近更新 更多