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,发往服务器进行验证,获得最终的tokens,并保存。
- 授权完成。