Twitter首次授权,三步这么走
初步结论
发送部分
- 当
method
为POST
时,postContent
为nil或需要上传的数据。
- 例外:申请用户授权的第一步时,
oauth_callback
是作为header
的一部分,而不是postContent
。
- 当
method
为GET
时,会需要在baseURL
后连接GET
的信息urlGetParameter
,形成新的fullURL
。
oauth_signature
的计算,是将method
,baseURL
和所有要发送的信息连起来,并计算校验值。其中,除method
和baseURL
之外的所有的键值对,需要按照键的字母顺序进行排列。
oauth_signature
的计算,signing_key
由两部分构成,consumer_secret
和oauth_token_secret
两部分合成,中间用&
连接。
- 例外:申请用户授权的第一步时,由于没有下发的
oauth_token_secret
,signing_key
为consumer_secret
+&
。
header
永远使用Authorization
字段,该字段使用的键为七个:oauth_consumer_key
,oauth_nonce
,oauth_signature
,oauth_signature_method
,oauth_timestamp
,oauth_token
,oauth_version
。
- 例外:申请用户授权的第一步时,此时还没有服务器下发的
oauth_token
。但这时要把oauth_callback
加入其中。
- 例外:虽然
oauth_signature
的计算方法写的是使用baseURL
,但是我发现,当HttpMethod
为GET
时,既可以使用baseURL
进行计算,也可以使用fullURL
进行计算。当使用fullURL
时,需要把GET
的参数项对应的键值对,从oauth_signature
的计算中移除。
接收部分
- 接收成功的标志是
successStatusCode
=200。
- 接收的内容是一组由预定的键组成的键值对。可以认为,键值对与
baseURL
是对应的关系。
- 例外:申请用户授权的第二步时,会用到第一步里的跳转链接
oauth_callback
。
- 例外:申请用户授权的第二步时,由于用户需要用户授权,然后跳转,这一步,是没有返回值的。跳转之后的连接需要开发者手动拦截。
- 例外:类似发推功能的API这种,我们只需要确认成功发推,并不关注返回值。此时可以设定返回值的键为空,不对其进行处理。
具体实施
第一步:Obtaining a request token
- 采用
URLSessionDataTask
链接,并处理传来的数据
- 打开
WebViewViewController
第二步:Redirecting the user
- 通过内嵌的网页处理
URLRequest
- 用户登录并授权后,Twitter会跳转到
第一步
中设定的会掉页面
- 通过
WKNavigationDelegate
的func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
,截获该跳转,获得数据。
- 此时需要验证本次收到的
oauth_token
与第一步收到的相同
第三步:Converting the request token to an access token
- 采用
URLSessionDataTask
链接,将第二步
获得的oauth_verifier
,发往服务器进行验证,获得最终的token
s,并保存。
- 授权完成。