【问题标题】:How should I store access token from a 3rd part api我应该如何存储来自第 3 部分 api 的访问令牌
【发布时间】:2019-05-12 21:50:42
【问题描述】:

您好,我正在使用 meteorjs 和 3rd 方 api 在 3rd 方的数据库上创建用户。

我正在使用 oauth2 获取访问令牌,并且令牌有 2 小时的有效期。 在使用异步函数获取访问令牌后,我使用了几种不同的方法。

但是,我不想每次需要访问令牌时都调用异步函数,而是希望将其存储在服务器上直到它过期。

安全存储它们并在服务器上全局使用的最佳做法是什么?

提前多谢

【问题讨论】:

  • 一个很好的提示是当您的用户登录时 Meteor 如何存储身份验证令牌。您可以为其他令牌模仿这个概念。

标签: meteor oauth-2.0 access-token server-variables


【解决方案1】:

RFC6819 - Threat Model and Security Considerations 定义了几个威胁向量和计数器测量。在该部分5.3.3. Store Secrets in Secure Storage 定义有关如何存储机密的最佳实践。

大多数多用户操作系统将个人存储 不同的系统用户。此外,大多数现代智能手机操作 系统甚至支持将特定于应用程序的数据存储在 文件系统的单独区域并保护数据不被访问 其他应用

鉴于您正在运行基于 JavaScript 的前端应用程序,最好的方法是将访问令牌存储在 HTML5 web storage 中。

它允许您在 API 调用需要时访问令牌。此外,如果浏览器实现是安全的(例如:- 包含所有安全补丁等),这将提供一个安全存储,拒绝访问其他应用程序。此外,您还可以选择使用 sessionStorage 来提供在标签关闭时移除访问令牌的额外安全性。

【讨论】:

  • 感谢您的回答,但我认为我以错误的方式构建了这个问题。在我的情况下,客户端是服务器。所以没有涉及浏览器,不幸的是服务器上没有 sessionStorage。并且只有一个用户在使用该 api,并且该用户是服务器。
【解决方案2】:

我最终使用全局变量将令牌存储在服务器上;

token = '';

Meteor.methods({
  refreshToken: function () {
    token = getToken();
  ...
});

现在

token

适用于所有方法。我还检查令牌是否仍然有效,如果到期时间在 300 秒内,则刷新令牌。该部分的代码如下:

    const EXPIRATION_WINDOW_IN_SECONDS = 300;
    const expirationTimeInSeconds = token.expires_at.getTime() / 1000;
    const expirationWindowStart = expirationTimeInSeconds - EXPIRATION_WINDOW_IN_SECONDS;
    const nowInSeconds = (new Date()).getTime() / 1000;
    const shouldRefresh = nowInSeconds >= expirationWindowStart;
       if (shouldRefresh) {
           try {
               //refresh the token
           } catch (error) {
               console.log('Error refreshing access token: ', error.message);
           }
       }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2015-04-24
    • 2011-12-10
    • 2017-12-12
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多