总结Oauth步骤:
1、 用Consumer key & secret 申请request token
2、 Service Provider 根据consumer key & secret 生成 url
3、 Consumer将用户重定向到获得的url网页上
4、 用户授权给consumer权限
5、 Service Provider 将授权的request token 信息以url的方式发送给consumer(需在第一步中指定一个callback)
6、 Consumer用授权的request token换取access token
7、 Consumer可以为所欲为了XD
更详细的步骤:
首先所有Oauth签名的密钥都是consumer_secret+&+token_secret,当token还没有获得时(在申请request_token时)请求参数不带token,secret为consumer_secret+&,当request_token获得后,再换取access token时,请求参数必须带token(否则服务器认证将会被拒绝),secret为consumer_secret+&+token_secret。
其次,再说下请求签名生成的步骤:
1、收集所有请求参数:Oauth_param+additional_param
2、生成Base String
3、以Base String为明文,consumer_secret为密钥生成签名
4、将签名附到请求参数最后
最后认证流程:
1、 以consumer_key为主要请求参数(其他的一些参数或根据当前时间生成或固定),向request_token_url发起Http连接。
2、 连接后服务器发回响应,主要参数为oauth_token,oauth_secret。
3、 连接一个url: authorize_token/token=oauth_token。其中oauth_token为服务器发回的响应。将用户重定向到该url进行认证授权
4、 用户认证授权后,服务器将重定向到request token请求时的参数call_url,此时该返回的url将包含oauth_token(还是request_token时的那个token,值没变),oauth_verifier。
5、 以consumer_key,oauth_verifier,oauth_token为主要请求参数,向access_token_url发起Http连接。
6、 收到请求后,服务器返回响应,其中包含oauth_token,oauth_secret(这里的token就是access_token了)
7、 完
Signpost Spec:
OAuthConsumer,OAuthProvider两个实现Oauth流程的关键类。
OAuthConsumer保存着Consumer key & secret (输入参数)、token & token secret(根据当前的Oauth的流程走到哪一步,分别表示request token 和 access secret)
OAuthProvider主要的两个方法是retrieve request token &retrieve access token
Oauth1.0aConsumer端实现要点:
1、 Oauth要求每次请求都需要签名。以App Secret为密钥,Base String 为明文进行签名。Base String 的组成规则 Method + & + base_url +& + query_param,其中:
Method: Http 请求方法
Base_url:目标url
query_param:请求参数,
包括: OAUTH_CONSUMER_KEY
OAUTH_SIGNATURE_METHOD
OAUTH_TIMESTAMP
OAUTH_NONCE
OAUTH_VERSION
OAUTH_TOKEN(如果有的话,一般在申请request token之后生效)
将生成后的签名加到请求参数的后面,发送请求给服务器。(这里根据服务器的要求可能会多点或少点请求参数,一般不太会少,但是服务器可以指定将请求参数放在Http头或者Post中)
2、 在以上Oauth参数中,只有consumerkey 和 consumersecret为需要指定的,其他都是写死的或者是自动生成的。Signature method、Verson是固定的,timestamp和nonce是根据当前时间生成的两串数字。Secret作为签名密钥,不在请求参数中
3、 Oauth基于Http协议实现,所以发送Oauth请求,也就是发送一个Http请求,只是根据服务器的要求,将请求参数放在Http头或者Post中(一般都在Http头,某些蛋疼的会放在post)中。Oauth头域应该和下列字符串相似:
OAuth oauth_consumer_key=XXX,oauth_signature_method=HMAC..,oauth_signature=XXX