美文网首页demoEdisonswift3.0
swift微博第12天(OAuth授权)

swift微博第12天(OAuth授权)

作者: IIronMan | 来源:发表于2017-08-20 19:23 被阅读64次
    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:
        注意:授权回调地址一定要完全一致
    • 3.7.获取未授权的RequestToken

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

    获取未授权的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

    利用授权的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
       }
    }
    
    单粒式的网络工具

    相关文章

      网友评论

        本文标题:swift微博第12天(OAuth授权)

        本文链接:https://www.haomeiwen.com/subject/fztccxtx.html