嗨,我正在使用 meteorjs 和 3rd 方 api 在 3rd 方的数据库上创建用户。
我正在使用 oauth2 获取访问令牌,并且令牌有 2 小时的有效期。在使用异步函数获取访问令牌后,我使用了几种不同的方法。
但是,我不是每次需要访问令牌时都调用异步函数,而是想将它存储在服务器上直到它过期。
安全存储它们并在服务器上全局使用它的最佳实践是什么?
提前谢谢了
嗨,我正在使用 meteorjs 和 3rd 方 api 在 3rd 方的数据库上创建用户。
我正在使用 oauth2 获取访问令牌,并且令牌有 2 小时的有效期。在使用异步函数获取访问令牌后,我使用了几种不同的方法。
但是,我不是每次需要访问令牌时都调用异步函数,而是想将它存储在服务器上直到它过期。
安全存储它们并在服务器上全局使用它的最佳实践是什么?
提前谢谢了
RFC6819 - 威胁模型和安全注意事项定义了几个威胁向量和计数器测量。在该部分5.3.3。在安全存储中存储机密定义了如何存储机密的最佳实践。
大多数多用户操作系统隔离不同系统用户的个人存储。此外,大多数现代智能手机操作系统甚至支持在文件系统的不同区域中存储特定于应用程序的数据,并保护数据不被其他应用程序访问
鉴于您正在运行基于 JavaScript 的前端应用程序,最好的方法是将访问令牌存储在HTML5 Web 存储中。
它允许您在 API 调用需要时访问令牌。此外,如果浏览器实现是安全的(例如:- 包含所有安全补丁等),这将提供拒绝访问其他应用程序的安全存储。此外,您还可以选择使用sessionStorage来提供在选项卡关闭时删除访问令牌的附加安全性。
我最终使用 global var 将令牌存储在服务器上;
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);
}
}