【发布时间】:2013-03-14 19:43:34
【问题描述】:
认证
身份验证将基于签名。将使用以下方式生成签名:
HMAC_SHA256(SHA1(secret_key) + '#' + request_data + '#' + utc_timestamp)
utc_timestamp 也将包含在 X-Timestamp 标头或使用 _timestamp 参数的 URL 中。 request_data 将包含所有参数(URL 和 POST)和 API 相关的标头。所有这些数据都将使用= 和& 进行小写、排序和连接。
通常,REST API 将支持三种身份验证模式:
API 密钥 - 签名将包括与特定 API 密钥关联的特殊密钥。将使用
X-API-Key标头或_api_keyURL 参数和X-API-Signature标头或_signatureURL 参数。用户凭据 - 签名将使用密码作为密钥。将使用
X-API-Signature标头或_signatureURL 参数和staff_nameURL 参数。Session - 签名将使用用户的密码或特殊生成的代码(下面有更多详细信息)... 将使用
X-Session-Signature标头或_session_signatureURL 参数和X-Session-ID标头或_session_idURL 参数。
请注意,规范允许同时使用 User credentials 和 Session(即它们的标头和参数不冲突)。
会话
免责声明:是的,我知道 - 会话不是 RESTful,因为它们是有状态的......但是,我们的产品需要会话来实现某些功能,并且为了简单起见,我们希望维护一个 API/协议 -所以我不想进入 RESTful 辩论。我更愿意认为,会话只是一种资源,您在使用 API 时需要对其进行维护。
会话将只是一个资源:/api/v1/session。
所以,标准程序:
要创建会话,客户端应用程序需要使用 员工凭据 身份验证发送 POST 请求,如上所述:
POST /api/v1/session&staff_name=s-andy。服务器将回复
201 Created,并在响应正文中传递会话ID。之后客户端应用程序将使用此会话 ID 和员工密码来访问 API。
在收到具有特定会话 ID 的请求后,服务器将更新相应会话资源的最后访问时间。
但我们的用户也可以选择使用双重身份验证。在登录后的用户界面中,这些用户将被要求输入验证码,该验证码将出现在他们的移动设备上。在设计身份验证时,我认为拥有一些特殊的“秘密”而不是会话的用户密码会很棒。然后我恍然大悟——为什么不使用这个验证码?
所以双因素身份验证的流程是:
客户端应用程序使用员工凭据发送 POST 请求。
服务器发起验证码生成和传递,并返回
202 Accepted和会话ID,但会话尚未验证。在 30 秒内,客户端应用程序使用
X-Session-ID标头或_session_idURL 参数中的会话 ID 和 验证码 发送 any 请求> 作为生成签名的秘密。-
收到此类请求后,服务器会更新会话,使其经过验证,并将验证码(也称为一次性密码)保存为该会话的密钥。
之后客户端应用程序将使用 session id 和 验证码(作为密钥)访问 API。
当会话超时并因此被删除,或者当用户删除会话(即执行注销)时,会话 ID 和“一次性密码”变得不可用。
我想利用这个专家社区作为这个双因素身份验证想法的传声筒;你能看到我看不到的任何陷阱吗?
【问题讨论】:
标签: rest