swift微博第12天(OAuth授权)

简介: swift微博第12天(OAuth授权)
1.基本概念


  • OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准
  • OAuth 的授权不会使第三方触及到用户的帐号信息
  • OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据
  • 每一个令牌授权一个 特定的网站 在 特定的时段内 访问 特定的资源


2.OAuth 授权流程图

image.png


3.注册应用程序


  • 3.1.注册新浪微博账号
  • 3.2.访问微博开发者平台
  • 3.3.点击 微连接 - 移动应用
  • 3.4.填写基本信息,如下图所示:


image.png


3.5.点击 应用信息 - 高级信息,设置回调地址,如下图所示:


image.png


  • 3.6.应用程序信息


  • App Key:填写你们自己的
  • App Secret:填写你们自己的
  • redirect_uri:填写你们自己的
  • access_token:
    注意:授权回调地址一定要完全一致


  • 3.7.获取未授权的RequestToken


授权请求地址https://api.weibo.com/oauth2/authorize?client_id=2202957917&redirect_uri=http://www.jianshu.com/u/8fed18ed70c9


image.png


注意:

- 1.不能有多余的空格  否则报: `(error:invalid_client)`
 - 2.如果`APP key`不对也会报: `(error:invalid_client)` 
 -  3.如果`url`不对也会报错  `(error:redirect_uri_mismatch)`


  • 3.8.获取已经授权的RequestToken(让用户登录)
  • 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


image.png



/*
 * 换取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
   }
}


image.png

目录
相关文章
|
SQL 存储 Oracle
swift微博第25天(SQLite)
swift微博第25天(SQLite)
202 0
swift微博第25天(SQLite)
|
Swift
swift微博第21天(图片选择器)
swift微博第21天(图片选择器)
437 0
swift微博第21天(图片选择器)
|
Swift
swift微博第15天(新版的判断以及跟控制器的切换)
swift微博第15天(新版的判断以及跟控制器的切换)
153 0
swift微博第15天(新版的判断以及跟控制器的切换)
|
Swift
swift微博第14天(新特性的引导图)
swift微博第14天(新特性的引导图)
161 0
swift微博第14天(新特性的引导图)
|
程序员 API Swift
swift微博第11天(三方框架的导入和手动导入的桥接以及swift单粒)
swift微博第11天(三方框架的导入和手动导入的桥接以及swift单粒)
156 0
swift微博第11天(三方框架的导入和手动导入的桥接以及swift单粒)
|
Swift
swift微博第9天(自定义微博首页的菜单)
swift微博第9天(自定义微博首页的菜单)
159 0
swift微博第9天(自定义微博首页的菜单)
|
Swift
swift微博第7天(导航条按钮的封装)
swift微博第7天(导航条按钮的封装)
126 0
swift微博第7天(导航条按钮的封装)
|
Swift
swift微博第6天(未登录界面的完善)
swift微博第6天(未登录界面的完善)
102 0
swift微博第6天(未登录界面的完善)
|
JSON Swift 数据格式
swift微博第3天(动态加载控制器)
swift微博第3天(动态加载控制器)
103 0
swift微博第3天(动态加载控制器)
|
Swift
swift微博第2天(命名空间和控制器字符串)
swift微博第2天(命名空间和控制器字符串)
120 0
swift微博第2天(命名空间和控制器字符串)