我们正在使用 DurandalJS 在 Javascript 中开发一个单页应用程序,它将成为 REST API 服务器的客户端。
以下是我们考虑身份验证过程的方式:
步骤1
客户端将拥有一个 API 密钥和一个私钥;API 密钥将是公开的,而私钥将是秘密的,仅用于签署请求(签名将由服务器重新创建并进行比较,类似于两腿 OAuth)。
客户端将进行 POST 调用https://api/sessions/
,我们将作为参数发送:
- api键
- 用户/通行证
- 随机数
- 时间戳
- 签名(使用私钥的参数的 HMAC)
第2步
服务器将使用客户端在后续请求中使用的auth_token进行响应,以识别用户。该令牌将是短暂的(例如设置为在一小时内到期)。
auth_token 将被分配给某个 user_id 和 API 密钥,因此如果被另一个 API 密钥使用,它就无效。
第 3 步
任何后续请求都必须包括 API 密钥、随机数、时间戳、auth_token 和签名。随机数和时间戳用于过滤中间人的重放攻击,而加密将由 SSL 保护。
使用 Javascript SPA 的缺点是代码是通过控制台公开的,因此可能会发现私钥。但是,即使攻击者发现并重新创建了签名,没有 auth_token 的任何请求都将无效。由于令牌是通过调用在安全的 HTTPS 连接中获得的https://api/sessions
,所以中间的人无法获得它。
我们可以通过混淆 JS 代码来添加另一层安全性,但这是通过晦涩难懂的安全性。
我的问题是:是否有更安全的方式来处理使用 SPA JS 客户端的身份验证过程?
谢谢!