在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

Posted

技术标签:

【中文标题】在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌【英文标题】:Maintaining Secret key and Access Token for JWT in Express and NodeJS with Facebook in Rest API 【发布时间】:2016-06-08 11:52:31 【问题描述】:

我有两个应用程序:

服务器(REST API 服务器) 节点js 快递 jsonwebtokens express-jwt 猫鼬 客户端(便携式前端) 引导 Angular JS 本地存储 角脸书 角度-jwt

稍后,客户端应用程序将被移植到使用 phonegap 的 android、iphone 和其他平台。对于 OAuth,我使用 Facebook 作为提供者。现在,我刚刚意识到 JSON Web Tokens 是这种设置的方式。我的问题是架构问题而不是语法问题 - 在 nodejs 中使用 JWT 签署 facebook 访问令牌和用户 ID 时如何管理密钥?

这就是我的应用中流程的工作方式:

    Angular 客户端有一个登录按钮 用户点击按钮 > Facebook Auth 开始 客户收到 user_id 和 FB 访问令牌 Client 将 [POST json body] user_id 和 Access Token 发送到 'http://server.com/auth/login'Node+Express Server >

    Node Server 已将 express-jwt 应用于除 /auth/login 之外的所有路由,并带有

    var expressJwt = require('express-jwt');

    var jwt = require('jsonwebtoken');

    app.use(expressjwt( secret: '').unless(path: ['/auth/login']));

    节点服务器req.body 接收数据,使用 javascriptSDK 从 facebook 获取所有配置文件详细信息,并使用

    对其进行签名

    var token=expressjwt.sign(profile, );

    Node Server 存储(更新,如果 user_id 存在)db 中的新令牌并将其作为响应发送给 client client 将接收到的新令牌作为 json 数据存储在本地存储中 客户端使用 angular-jwt 从新令牌中获取配置文件数据,并自动将新令牌附加到其发送到服务器的所有请求的 Authorization 标头中

现在,我的问题是:

    我真的需要将 JWT 令牌存储在数据库中吗?我当然不会将请求标头中的令牌与数据库进行比较 是否需要在每次有人登录时生成随机密钥以确保安全?如果是,那么它如何同时适用于客户端和服务器? 我需要在何时何地检查令牌是否过期?以及如何刷新它?

我对设计流程和机制有点迷茫。

【问题讨论】:

那么现在你是怎么做到的??您是在使用一些数据库来存储已撤销的令牌还是什么?请回复是否对我真的有帮助 【参考方案1】:

广告 1. 您不必将 JWT 存储在数据库中。用户 ID 可以是负载的一部分,因此不需要它。

广告 2. 服务器端应用程序使用一个密钥来生成所有 JWT 是一种常见的做法。

广告 3. 对您的 API 的每个请求检查令牌是否已过期,如果令牌已过期则禁止访问,返回 401 状态代码。客户端应用程序应提示用户输入凭据并请求新的 JWT。如果您想避免用户重新提交凭据,您可以发出刷新令牌,稍后可用于生成新的 JWT。

JWT refresh token flow

http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/

【讨论】:

感谢您的回答。您能否进一步详细说明:如果我想从服务器端撤消对特定令牌的访问权限怎么办?而且,如果我尝试为每个用户生成一个新的密钥,对于客户端,我是否也应该对其进行散列并将其存储在本地存储中,以便解码新令牌以从有效负载中提取信息? 如果实施得当,您可以相信来自用户的 JWT 有效负载是您最初发送给他们的未更改数据。您可以利用它来撤销令牌:为每个有效负载添加一个“有效”标志,如果设置为 false,则强制重新授权。 是的,但是如果有人注销而不是你没有撤销这个令牌,现在其他人可以使用这个令牌吗?? @amanverma 保持您的 JWT 到期时间较短。这样,您所要做的就是撤销刷新令牌,然后等待 JWT 过期,此时撤销完成。由于 JWT 到期时间较短,您可以通过内存中的 JWT 撤销存储实现即时 JWT 撤销,因为这些撤销不需要在到期后存储。

以上是关于在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

使用旧的 rest api 的 Facebook 会话密钥

接受 facebook 登录到我的 REST API

iOS、REST API - Facebook 登录

移动应用程序中的 Facebook 登录(由 REST API 支持)

使用 Facebook 进行身份验证的网站的 REST API