1.基本概念
- OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准
- OAuth 的授权不会使第三方触及到用户的帐号信息
- OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据
- 每一个令牌授权一个 特定的网站 在 特定的时段内 访问 特定的资源
2.OAuth 授权流程图
3.注册应用程序
- 3.1.注册新浪微博账号
- 3.2.访问微博开发者平台
- 3.3.点击 微连接 - 移动应用
- 3.4.填写基本信息,如下图所示:
3.5.点击 应用信息 - 高级信息,设置回调地址,如下图所示:
- 3.6.应用程序信息
- App Key:
填写你们自己的
- App Secret:
填写你们自己的
- redirect_uri:
填写你们自己的
- access_token:
注意:授权回调地址一定要完全一致
- 3.7.获取未授权的RequestToken
注意:
- 1.不能有多余的空格 否则报: `(error:invalid_client)` - 2.如果`APP key`不对也会报: `(error:invalid_client)` - 3.如果`url`不对也会报错 `(error:redirect_uri_mismatch)`
- 3.8.获取已经授权的
RequestToken
(让用户登录)
- 1.如果是第一次对某个
app
授权,会跳转到授权的界面 - 2.如果点击授权:
http://www.jianshu.com/u/8fed18ed70c9?code=87b6219924abf101f3824272a6309f83
code:后面的字符串就是已经授权的RequestToken
:87b6219924abf101f3824272a6309f83
- 3.9.利用已经授权的
RequestToken
换取access_token
4.跳转进入授权的控制器
import UIKit class OAuthViewController: UIViewController { // 全局变量 let appKey = "2202957917" let appSecret = "f482e170b0d6eae93b4abdfff285a9c8" let redirect_uri = "http://www.jianshu.com/u/8fed18ed70c9" override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.red view.addSubview(webView) navigationItem.title = "安其拉之路"; navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "返回", style: UIBarButtonItemStyle.plain, target: self, action: #selector(OAuthViewController.click)) // 1.获取未授权的RequestToken 要求 SSL 1.2版本 let urlStr = "https://api.weibo.com/oauth2/authorize?client_id=\(appKey)&redirect_uri=\(redirect_uri)" let url = NSURL(string: urlStr) let request = NSURLRequest(url: url! as URL) webView.loadRequest(request as URLRequest) } private lazy var webView: UIWebView = { let webview = UIWebView(frame: CGRect(x: 0, y: 0, width: JKscreenW, height: JKscreenH)) webview.delegate = self return webview }() func click(){ dismiss(animated: true, completion: nil) } } extension OAuthViewController: UIWebViewDelegate{ // 返回 true正常加载 false不加载 func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool{ /* 加载授权界面 https://api.weibo.com/oauth2/authorize?client_id=2202957917&redirect_uri=http://www.jianshu.com/u/8fed18ed70c9 跳转到授权界面 https://api.weibo.com/oauth2/authorize 授权成功 http://www.jianshu.com/u/8fed18ed70c9?code=ed9df4b69d51158ad03d15a72ea8fa65 取消授权 http://www.jianshu.com/u/8fed18ed70c9?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330 */ print(request.url!.absoluteString) // 1.如果不是授权回调页,就继续加载 if !request.url!.absoluteString.hasPrefix(redirect_uri) { // 继续加载 return true } // 2.判断是否授权成功 let codeStr = "code=" if request.url!.query!.hasPrefix(codeStr) { // 授权成功 print("授权成功") let code = request.url!.query?.substring(from: codeStr.endIndex) print(code!) }else{ // 取消授权 print("取消授权") } return true } }
5.利用授权的RequestToken 来换取AccessToken
/* * 换取AccessToken * :param: code 已经授权的 RequestToken */ private func loadAccessToken(code: String){ // 1.定义路径 let path = "oauth2/access_token" // 2.封装参数 let params = ["client_id":appKey,"client_secret":appSecret,"grant_type":"authorization_code","code":code,"redirect_uri":redirect_uri] NetworkTools.shareNetworkTools().post(path, parameters: params, progress: nil, success: { ( _, JSON) in print(JSON!) }) { (_, error) in print(error) } print(path) }
// 说明你要自己写一个网络的封装NetworkTools.swift
import UIKit import AFNetworking class NetworkTools: AFHTTPSessionManager { static let tools: NetworkTools = { // 注意: baseURL一定要以 / 结尾 let url = NSURL(string: "https://api.weibo.com/") let t = NetworkTools(baseURL: url! as URL) t.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json", "text/json", "text/javascript","text/plain") as? Set<String> return t }() // 获取单粒方法 class func shareNetworkTools() -> NetworkTools { return tools } }