javascript - Node.js Passport OAuth 2.0 身份验证 : where to store access and refresh tokens

标签 javascript node.js oauth-2.0 passport.js access-token

使用 passport 时在 node.js应用程序作为 Oauth 2.0 流(例如 Facebook、Twitter 等)的身份验证中间件。我想知道在应用程序中存储访问 token 和刷新 token 的常见/最佳实践是什么。我不需要在应用程序中存储用户帐户,我只需要访问 token 来调用 API。

例如,如果我想通过 OAuth 2.0 身份验证提供程序对用户进行身份验证以获取用于基于 oauth 的 API 的访问 token ,我可以使用以下 passport strategy :

passport.use(new OAuth2Strategy({
    authorizationURL: 'https://www.example.com/oauth2/authorize',
    tokenURL: 'https://www.example.com/oauth2/token',
    clientID: EXAMPLE_CLIENT_ID,
    clientSecret: EXAMPLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/example/callback"
  },
  function(accessToken, refreshToken, profile, cb) {
    // handle user profile and tokens
    // [...]
  }
));

如何以及在哪里以安全的方式存储 token ?
可以将 token 附加到用户个人资料吗?像这样:
function(accessToken, refreshToken, profile, cb) {
    profile.accessToken = accessToken;
    profile.refreshToken = refreshToken;
    process.nextTick(() => return cb(null, profile))
}

最佳答案

可能知道你已经找到了答案,但分享了我的回复,因为这个问题有一些访问,而我也被同样的问题困住了几个小时。

在我解释我如何解决它之前,请注意我正在使用 Passport 天蓝色广告 (策略)但我想其他策略也会类似。

我注意到有些人将 token 存储在 cookie 中,我不是安全专家,但这可能不是最好的主意。我选择将它们存储在用户的 session 中,因此只要 session 打开,它们就会保留在服务器端。

有一个很好的细节,为了在 session 中存储数据,您需要在策略的回调验证函数中访问 req 对象,您可以使用 6 种不同的原型(prototype),但是如果您想访问 req 对象,请确保您启用选项“passReqToCallback:true”并使用以下原型(prototype):

function(req, iss, sub, profile, jwtClaims, access_token, refresh_token, params, done)

检查以下示例:
passport.use(new OIDCStrategy({
  //... all your strategy options
  passReqToCallback: true,
},
  function (**req**, iss, sub, profile, accessToken, refreshToken, done) {
    // store tokens in session
    req.session.accessToken = accessToken; 
    req.session.refreshToken = refreshToken;
... 

更新 session 后,您可以随时在服务器端访问该值。

关于javascript - Node.js Passport OAuth 2.0 身份验证 : where to store access and refresh tokens,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54351130/

相关文章:

javascript - Highcharts 每小时刻度间隔

javascript - 具有 REST API 架构的单页应用程序

javascript - 在 ES6 中,为什么不使用 this 就不能引用同级方法?

javascript - 从包含的 JSONArray 中选择所有 JSONObjects

php - 无法在 PHP 中刷新 OAuth2 token ,授予无效

c# - `[Authorize(Roles = "管理 ")]` 无限循环 ASP.NET MVC 和 Azure Active Directory B2C

javascript - PHP在不访问网站的情况下执行网站代码

node.js - 如何使用 node.js 确保所有目录在 fs.writeFile 之前存在

node.js - Angular-cli项目跨平台构建问题

oauth - 为什么要对 Authorization header 进行 base64 编码?