2015-02-09 41 views
15

密钥和访问令牌JWT在快递以及与Facebook的NodeJS我有两个应用:维持在REST API

  • 服务器(REST API服务器)
    • 节点JS
    • 快递
    • jsonwebtokens
    • express-jwt
    • 猫鼬
  • 客户端(便携式前端)
    • 自举
    • 角JS
    • 本地存储
    • 角的Facebook
    • 角JWT

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

因此,这是流在我的应用程序是如何工作的:

  1. 客户有一个登录按钮
  2. 用户点击按钮> Facebook的身份验证开始
  3. 客户接收user_id说明和FB访问令牌
  4. 客户端发送[POST json主体] ser_id和访问令牌节点+ Express服务器'http://server.com/auth/login'
  5. 节点服务器已申请快递,智威汤逊的所有路线,除了/认证/注册

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

    var jwt = require('jsonwebtoken'); ({secret:''})。except({path:['/ auth/login']}));

  6. 节点服务器req.body接收数据,使用

    VAR令牌= expressjwt它提取使用JavascriptSDK来自Facebook的所有配置文件的细节,和标志。标志({profile},);

  7. 节点服务器存储(更新,如果USER_ID存在)的新令牌中分贝并且将其作为响应于客户
  8. 客户将其存储为在本地存储
  9. JSON数据接收的新令牌
  10. 客户端使用角JWT从新令牌提取轮廓数据,并自动连接在授权报头的新的令牌用于将其发送到服务器
所有请求

现在,我的问题是:

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

我有点迷失了设计流程和机制。

+0

所以现在终于你怎么做呢??你使用一些数据库来存储撤销令牌或什么?请回复一定会对我真的有帮助 – 2016-01-13 22:36:18

回答

13

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

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

Ad 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/

+0

感谢您的回答。请您详细说明一下:如果我想从服务器端撤销特定令牌的访问,该怎么办?而且,如果我尝试为每个用户生成一个新的密钥,对于客户端,我是否应该对它进行哈希处理并将其存储在本地存储中,以解码新的令牌以从负载中提取信息? – 2015-02-10 06:28:29

+0

正确实施时,您可以相信用户的JWT有效负载是您最初发送给他们的_unaltered_数据。你可以利用它来撤销一个令牌:为每个有效负载添加一个“有效”标志,如果它设置为false,则强制重新授权。 – sedge 2015-05-18 20:29:52

+0

是的,但如果有人注销比如果你没有撤销这个令牌现在别人可以使用这个令牌的一生? – 2016-01-13 22:35:03