使用 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 进行环回身份验证的主要内容,如果未能解决你的问题,请参考以下文章