使用 JWT 进行环回身份验证

Posted

技术标签:

【中文标题】使用 JWT 进行环回身份验证【英文标题】:Using JWT for Loopback authentication 【发布时间】:2016-04-01 03:53:27 【问题描述】:

我正在尝试了解如何将自定义 JWT 路由融入环回安全模型。我的应用程序有一个涉及 SMS 的身份验证“舞蹈”,它使用excellent description 生成一个有效的 JWT 令牌。我正在使用jsonwebtoken,一切正常。获得令牌后,我的 angular.js 客户端将令牌与 Authorisation: JWT ..token.. 标头中的每个请求一起发送(发现有冲突的文档,一个说 JWT,一个承载,但我可以弄清楚)。

现在我想在环回应用程序中使用令牌。我想使用 ACL 系统环回提供的。我确实阅读了以下资源:

Authenticate a Node.js API with JSON Web Tokens Loopback, loggin in users Third-party login (Passport) Loopback, making authenticated requests Passport strategy for JWT Loopback OAuth2.0 source Loopback satelizer

而且我不清楚我的下一步是什么。我有工作:

用户“登录” - 生成 JWT 用户使用用户名/密码登录(即将停用) 在环回中工作的 ACL 实现(当我访问 ACL 受保护的资源时,我得到了预期的 4xx 错误) 我的 JWT 令牌正确 (?) 在请求的标头中

我需要:

基于 JWT 令牌,具有与环回 ACL 兼容的角色的有效用户

非常感谢您的帮助

【问题讨论】:

你有没有想过这个问题? 谢谢提醒我。是的,我做到了。下面回答 JWT 令牌的认证方案是“Bearer”。 【参考方案1】:

结果证明解决方案比我想象的要简单得多。对于初学者,环回确实使用自己的 jwt webtoken 来保持(无状态)用户会话。建立身份后(在我的情况下,从我的 JWT 令牌中提取手机号码)我只需要查找成员并生成环回本机 JWT 令牌。我的端点定义是这样的:

  Member.remoteMethod(
    'provideSMSToken', 
      accepts: [
        arg: 'mobilenumber',
        type: 'string',
        description: 'Phone number including +65 and no spaces'
      , 
        arg: 'token',
        type: 'string',
        description: 'the token received through SMS'
      ],
      returns: 
        arg: 'token',
        type: 'string'
      ,
      description: 'provide SMS token to confirm login',
      http: 
        path: '/smsauthenticate',
        verb: 'post'
      ,
      isStatic: true
    

  );

还有 provideSMSToken 这样的函数:

 // Exchange the SMS Token with a login token
  Member.provideSMSToken = function(mobilenumber, token, cb) 
    var app = Member.app;
    // CHeck if the token does exist for the given phone number
    // if yes, check for the respective memeber

    if (!app.smsVerificationToken || !app.smsVerificationToken[mobilenumber] || app.smsVerificationToken[mobilenumber] !== token) 
      var wrongToken = new Error("Wrong or missing token");
      cb(wrongToken, "Wrong or missing token");
     else 
      var timetolive = 86400;
      Member.lookupByPhone(mobilenumber, function(err, theOne) 
        if (err) 
          cb(err, "Sorry, no such member here!");
         else 
          // We can provide a token now for authentication
          // using the default createAccessToken method
          theOne.createAccessToken(timetolive, function(err, accesstoken) 
            cb(err, accesstoken);
          )
        
      );
    
  

像魅力一样工作

【讨论】:

我正在使用环回,但它没有使用 JWT,我一直在寻求实现它们。您是否必须配置某些东西,或者它使用开箱即用的 JWT? Loopback 身份验证令牌是 JWT。 环回还是网关?因为我的数据库正在存储令牌并且它们没有正常的 jwt 结构。 JWT 是编码(未加密)签名的任意内容。没有所谓的“正常”结构。但是您可能想提出一个新问题并提出所有活动部分。当您提供不完整的信息时,您将无法得到您正在寻找的答案 JWT 具有“正常结构”。它由标头、有效负载和签名组成,以点分隔 - 请参阅 jwt.io 。我们的 LoopBack 应用程序中使用的访问令牌没有三个部分,不解码为任何有效负载,也不是无状态的,因为它们存储在数据库中。 (至少是我正在研究的实现)。我在环回文档中也没有看到任何关于 JWT 的内容。您是否有机会发送一些链接来解释如何在环回中使用 JWT?

以上是关于使用 JWT 进行环回身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 进行身份验证的最佳实践

使用护照 jwt 进行身份验证

使用 Airflow API 进行 JWT 身份验证

使用 Firebase 登录的 Loopback 4 身份验证

使用 JWT 进行 PHP 身份验证

使用 JWT 进行身份验证时是不是可以消除私钥攻击向量?