在 Express 中维护 JWT 的密钥和访问令牌,在 Rest 中使用 Facebook 维护 NodeJS API
Maintaining Secret key and Access Token for JWT in Express and NodeJS with Facebook in Rest API
我有两个申请:
- 服务器(REST API 服务器)
- 节点js
- 快递
- json网络令牌
- express-jwt
- 猫鼬
- 客户端(便携Front-end)
- bootstrap
- Angular JS
- local-storage
- angular-facebook
- angular-jwt
稍后,客户端应用程序将移植到 android、iphone 和其他使用 phonegap 的平台。对于 OAuth,我使用 Facebook 作为提供者。现在,我刚刚意识到 JSON Web 令牌是进行此类设置的方法。我的问题是架构问题而不是语法问题 - 在 nodejs 中使用 JWT 签署 facebook 访问令牌和用户 ID 时如何管理密钥?
这就是流程在我的应用程序中的工作方式:
- Angular 客户端 有一个登录按钮
- 用户点击按钮 > Facebook 身份验证开始
- 客户端 收到user_id 和 FB 访问令牌
- 客户端发送[POSTjsonbody]两者user_id和 Node+Express Server 在 'http://server.com/auth/login'
的访问令牌
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 存在)数据库中的新令牌并将其作为对 client[=93= 的响应发送]
- 客户端 将它收到的新令牌作为 json 数据存储在 local-storage
中
- 客户端使用 angular-jwt 从新令牌中获取配置文件数据,并自动在授权 header 中为它发送到服务器
现在,我的问题是:
- 我真的需要将 JWT 令牌存储在数据库中吗?我当然不会将请求 headers 中的令牌与数据库
进行比较
- 每次有人登录时,我是否需要生成随机密钥以确保安全?如果是,那么它如何同时适用于客户端和服务器?
- 何时何地需要检查令牌是否过期?以及如何刷新它?
我对设计流程和机制有点迷茫。
广告 1. 您不必将 JWT 存储在数据库中。用户 ID 可以是负载的一部分,因此没有必要。
广告 2. 服务器端应用程序使用一个密钥生成所有 JWT 是一种常见做法。
广告 3. 检查您的 API 每次请求的令牌是否已过期,如果令牌已过期则不允许访问,return 401 状态代码。客户端应用程序应提示用户输入凭据并请求新的 JWT。如果您想避免用户重新提交凭据,您可以发布一个刷新令牌,稍后可用于生成新的 JWT。
JWT refresh token flow
我有两个申请:
- 服务器(REST API 服务器)
- 节点js
- 快递
- json网络令牌
- express-jwt
- 猫鼬
- 客户端(便携Front-end)
- bootstrap
- Angular JS
- local-storage
- angular-facebook
- angular-jwt
稍后,客户端应用程序将移植到 android、iphone 和其他使用 phonegap 的平台。对于 OAuth,我使用 Facebook 作为提供者。现在,我刚刚意识到 JSON Web 令牌是进行此类设置的方法。我的问题是架构问题而不是语法问题 - 在 nodejs 中使用 JWT 签署 facebook 访问令牌和用户 ID 时如何管理密钥?
这就是流程在我的应用程序中的工作方式:
- Angular 客户端 有一个登录按钮
- 用户点击按钮 > Facebook 身份验证开始
- 客户端 收到user_id 和 FB 访问令牌
- 客户端发送[POSTjsonbody]两者user_id和 Node+Express Server 在 'http://server.com/auth/login' 的访问令牌
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 存在)数据库中的新令牌并将其作为对 client[=93= 的响应发送]
- 客户端 将它收到的新令牌作为 json 数据存储在 local-storage 中
- 客户端使用 angular-jwt 从新令牌中获取配置文件数据,并自动在授权 header 中为它发送到服务器
现在,我的问题是:
- 我真的需要将 JWT 令牌存储在数据库中吗?我当然不会将请求 headers 中的令牌与数据库 进行比较
- 每次有人登录时,我是否需要生成随机密钥以确保安全?如果是,那么它如何同时适用于客户端和服务器?
- 何时何地需要检查令牌是否过期?以及如何刷新它?
我对设计流程和机制有点迷茫。
广告 1. 您不必将 JWT 存储在数据库中。用户 ID 可以是负载的一部分,因此没有必要。
广告 2. 服务器端应用程序使用一个密钥生成所有 JWT 是一种常见做法。
广告 3. 检查您的 API 每次请求的令牌是否已过期,如果令牌已过期则不允许访问,return 401 状态代码。客户端应用程序应提示用户输入凭据并请求新的 JWT。如果您想避免用户重新提交凭据,您可以发布一个刷新令牌,稍后可用于生成新的 JWT。
JWT refresh token flow