- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力寻找一种方法来安全地保存访问 token ,这是我的网络应用程序在用户授权应用程序后从 DiscordAPI 检索到的。
我正在为 Discord Bot 创建一个网络界面。这里很重要,不是每个人都可以使用它。只应允许特定 Discord 服务器上的服务器版主等访问网站的大部分内容。为此,我使用 Discord 中的 OAuth2 内容来检索访问 token ,通过它我可以获得用户信息,例如他们的唯一 ID。然后,该 ID 用于检查他们在 Discord 服务器上的 Angular 色类型。
现在获取 Access-Token 的部分已经编写好了,看起来工作正常。我可以使用 token 从 Discord API 等查询数据。
我主要担心这里的安全问题。我已经阅读了几篇不同的帖子,但每个人似乎对此都有不同的看法。
我经常读到(甚至在 Auth2 网站上)的一个“解决方案”是将 token 保存在 cookie 中。
我不确定这是否安全。我不能简单地将 token 仅存储在服务器上,因为用户必须在 token 生命周期内保持登录状态。但是将其存储为 cookie 会使它容易受到攻击(我对这种攻击还不够熟悉,无法防范)。
我目前在收到 token 时有这一行:
res.cookie('authToken', response.access_token);
我还将该行调整为以下内容,因为这说明要删除所有通过脚本读取 cookie 的方式(这就够了吗?):
res.cookie('authToken', response.access_token, { httpOnly: true });
当访问网络界面的其他部分时,我会检查 cookie 是否存在,并尝试向 Discord 询问有关用户信息的信息。如果用户信息正确返回,我认为用户已正确通过身份验证:
router.get('/', catchAsync(async (req, res, next) => {
if(req.cookies.authToken === undefined) {
// Render index view
res.render('index', {
authenticated: false
});
}
else {
// Grab the token
const localToken = req.cookies.authToken;
// Use the token to query user information
const response = await discordapi.GetDiscordUserDetails(localToken);
if(response.id) {
// Open the Index page and pass the username over
res.render('index', {
authenticated: true,
username: response.username,
userid: response.id,
avatarid: response.avatar
});
} else {
res.render('index', {
authenticated: false
});
}
}
}));
(我传递的“已验证” bool 值仅更改 html(快速 Handlebars )文档中登录按钮的可见性。您不能用它做任何其他事情。)
现在,由于我对此的了解有限,我几乎认为这是最糟糕的做法,我想改进(这个)。
另一种解决方案是将访问 token 存储在 Web 服务器本身的数据库中。所以基本上从不以任何方式向用户展示它。但是,然后我需要一种将此 token 与用户匹配的方法,因此他们仍然需要某种带有信息的 cookie,我可以使用这些信息来获取 token 。我认为如果将 token 在数据库中加密并且用户拥有解密它的 key ,那将是最佳选择。但是,我不确定这是否再次安全,因为如果您读出 cookie,您仍然可以访问 token ,或者至少表现得好像您是那个特定用户。
那么保持 cookie 100% 安全是唯一的方法吗?我对此很陌生,尽管这很可能只是一个简单的 discord 服务器的小型 Web 界面,但我仍然希望正确执行此操作。
我还读到将 token 作为某种密码处理并将其包装到另一层“ session ”中是一种方法,但这听起来很复杂,我实际上不知道从哪里开始。
我希望有人能对此有所说明,因为安全是我真正害怕的事情。
感谢您的宝贵时间!
最佳答案
我想首先假设我已经看到网上银行应用程序发送身份验证 token 作为纯文本附加在 POST 中作为查询字符串。
话虽如此,开发人员必须做出的大部分安全考虑必须旨在保护后端结构,而不是防止用户在客户端遭到黑客攻击。 (显然,你会尽一切努力让最后一个假设变得不那么可信,但在道德和技术上都有一个限制。我的意思是,如果我连接到一个不安全的网络并且有人拦截了我的通信并设法对其进行解码,我认为这更多是我的错。)
无论如何,我将不再哲学化,但最后一个众所周知的观察是,永远不会有任何 100% 安全的解决方案。
使用 httpOnly cookie 是传输和存储身份验证 token 的最简单、最安全的方式,但如果这还不够,还可以实现其他一些安全层。这只是一些想法,可能还有更多!
缩短 token 的生命周期并在一段时间不活动后关闭 session 服务器端。您必须保留事件 session 的记录,每个 session 都有其开始时间和事件 token 等。
IP 检查。如果 session 以来自美国的 IP 地址开始,五分钟后 IP 似乎来自菲律宾,您可能必须采取一些措施。
使用 AWS Cognito 等外部身份验证服务。但它不会做任何你自己做不到的事情。
实现多重身份验证。
与 IP 检查类似,您可以使用用户代理字符串作为种子来计算哈希值,并将其存储。当您对客户身份有疑问时,请检查它。
谈到哈希,您可以存储 token 并将哈希发送给用户。唯一的改进是它可以防止有人直接调用 Discord API(如果 API 没有过滤器)。例如,密码始终存储为哈希值。
前者的任意组合。
这个列表可以无限地继续下去,在我看来,过了某个时间点,您只会不必要地浪费时间和资源。只要记住银行在 URL 中发送代币,你就会感觉好多了。
关于javascript - 如何安全地存储 Discord(OAuth2) 用户的访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275431/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!