对于一个API请求,开发平台一般需要知道下面几件事情:
- 哪个应用发起这个请求(Which application is making the request)
- 这个请求是为哪个用户发起的(Which user the request is posting on behalf of)
- 用户是否对这个请求进行授权(Whether the user has granted the application authorization to post on the user's behalf)
- 请求是否在传输过程中被篡改(Whether the request has been tampered by a third party while in transit)
为了让应用提供这些鉴权信息,一般开发平台采用OAuth进行授权认证。 OAuth 1.0a protocol
一般来说OAuth需要提供请求带上这些参数信息:
- OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog": 标识哪个应用发起这个API请求
- oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg": 每次请求都应该生成一个唯一的nonce值。API平台使用这个来确定一个请求是否被重复请求多次。一般使用timestamp作为nonce值。
- oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D": 使用密钥,对所有其他请求参数应用某个签名算法进行计算得到的签名结果。目的是确认请求没有在传输过程中被篡改。同时由于密钥与app是一一对应的,可以验证确实是该应用发起了这个请求。(这个过程和目的正是HTTPS要要解决的,所以使用HTTPS的auth2.0就不需要签名了。)
- oauth_signature_method="HMAC-SHA1": 常用的签名算法是HMAC-SHA1和MD5。可以指定一种,不让用户选择。
- oauth_timestamp="1318622958": 标识请求的发起时间,API平台一般会拒绝太老的请求。
- oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb": 代表用户对这个请求的授权,表示允许应用代表用户调用API操作他们的数据。
- oauth_version="1.0": OAuth版本,方便后续升级OAuth协议。
说明:有时候一些API并不是跟用户强关联的,比如搜索API,类目API。这时候就不需要用户授权,只需要验证app的合法性。Application-only authentication
twitter:Obtaining access tokens