我应该如何存储来自第三部分api的访问令牌

时间:2018-12-11 20:41:21

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

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

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

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

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

非常感谢

2 个答案:

答案 0 :(得分:0)

RFC6819 - Threat Model and Security Considerations定义了几种威胁向量和应对措施。在5.3.3. Store Secrets in Secure Storage部分中,定义了有关如何存储机密的最佳做法。

  

大多数多用户操作系统将个人存储区分开      不同的系统用户。而且,大多数现代智能手机在运行      系统甚至支持将特定于应用程序的数据存储在      分隔文件系统的各个区域,并保护数据不被以下人员访问      其他应用

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

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

答案 1 :(得分:0)

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

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);
           }
       }