node.js - 如何使用散列值创建正确的用户标识
问题描述
对后端、会话和密码学来说是全新的。所以我在这里问什么是识别Web应用程序用户的正确方法。
这是故事:
我正在为 Shopify 电子商务平台开发一个应用程序。当商家最初访问应用时,Shopify 会向应用发送 hmac 验证。当 Shopify 授权 hmac 得到验证时,应用存储“商店名称”cookie 并将应用页面作为响应发送回。问题是当商家遵循其他应用程序路线时,没有任何方法可以验证商家实际上是他/她是谁。应用程序在这些路线上拥有的唯一信息是“shopname”cookie。我想出了一些随机散列值来识别商家。我所做的是从随机值创建 hmac(作为 'app-token' cookie)并将它们和创建日期存储到数据库中的 'shopname' 值下。
当路由获取请求时,应用程序会读取“shopname”和“app-token”cookie,并向 DB 询问存储的值。然后检查自“app-token”创建以来是否不超过 1 天,根据这些值创建 hmac 并验证“app-token”cookie 是否相等。如果超过 1 天的商家被重定向到 Shopify hmac 授权路径,并且正在生成新的“app-token”hmac cookie 并将其存储到 DB(这是生成它的唯一位置)。
这就是“app-token”目前的样子:
var random_num = Math.random().toString();
var auth_hash = crypto.createHash('md5').update(random_num).digest('base64');
var auth_hmac_random_num = Math.random().toString();
var auth_hmac = crypto.createHmac('sha256',auth_hash).update(auth_hmac_random_num).digest('hex');
var auth_hmac_concant_random_num = Math.random().toString();
var auth_hmac_concat = crypto.createHash('md5').update(auth_hmac_concant_random_num).digest('hex');
var auth_hmac = auth_hmac_concat + auth_hmac;
auth_hash、auth_hmac_random_num、auth_hmac_concat 以 JSON 格式存储到数据库中的“shopname”值下。根据请求验证 auth_hmac_concat 从 'app-token' cookie 中删除,并且 hmac 是从 auth_hash 和 auth_hmac_random_num 创建的,并被验证为 'app-token' crypto.timingSafeEqual(hmac, app_token)
。
同样,我对后端完全陌生,我可能过于复杂或过于简化事情。问题是在所描述的姜黄素中识别商人的正确方法是什么?希望我足够清楚。
解决方案
如果您在商店进行身份验证时创建会话,那么您就是在做生意。真的没有必要竭尽全力打造自己的下一级身份验证。如果存在会话,则商店可以访问您的应用程序。没有会话,对它们进行身份验证。与过去十年中所有有价值的网络应用程序的模式几乎相同,对吧?为什么要把事情复杂化?
您可以聪明的一种情况是当您的应用程序有您进行的回调并且会话已过期时。在这种情况下,您需要优雅地重新验证并将应用程序恢复到原来的位置,以便对商家友好。没有多少应用程序能很好地做到这一点,但你可以。
推荐阅读
- maven - 在 MVN 存储库中找不到 jar
- java - 如何修复 JAVA 代码中的 CWE 1236(CSV 文件中公式元素的不正确中和)?
- android - 更改包含/部分布局中的 TextView 文本
- android - 在 Firestore 中添加数据的方法
- authentication - Cognito PreSignup Lambda 先在内部创建用户,然后在用户池中创建
- java - 从 JAR 可执行文件中的外部类读取时缺少注释
- linq - linq 组查询中的产品销售数量和名称
- mysql - PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR',致命:false } 错误:致命错误后无法将查询排入队列。在 Protocol._validateEnqueue
- scala - Scala更新映射列中键的值
- azure-devops - Azure DevOps:管道失败后运行步骤