1.基本概念
- OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准
- OAuth 的授权不会使第三方触及到用户的帐号信息
- OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据
- 每一个令牌授权一个 特定的网站 在 特定的时段内 访问 特定的资源
2.OAuth 授权流程图
**OAuth授权流程**3.注册应用程序
-
3.1.注册新浪微博账号
-
3.2.访问微博开发者平台
-
3.3.点击 微连接 - 移动应用
-
3.4.填写基本信息,如下图所示:
注册应用程序 -
3.5.点击 应用信息 - 高级信息,设置回调地址,如下图所示:
回调地址的添加 -
3.6.应用程序信息
- App Key:
填写你们自己的
- App Secret:
填写你们自己的
- redirect_uri:
填写你们自己的
- access_token:
注意:授权回调地址一定要完全一致
- App Key:
-
3.7.获取未授权的RequestToken
授权请求地址:https://api.weibo.com/oauth2/authorize?client_id=2202957917&redirect_uri=http://www.jianshu.com/u/8fed18ed70c9
注意:
- 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
- 1.如果是第一次对某个
-
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
利用授权的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
}
}
单粒式的网络工具
网友评论