关于Oauth认证的那些事

来源:互联网 发布:文章数据库设计 编辑:程序博客网 时间:2024/05/22 17:11

随着网络的发展, Oauth认证已经被广泛使用. 这篇博客就记录一下Oauth的使用过程.

以新浪微博为例.
使用微博认证需要一个微博开发者的账号~
下面先申请开发者账号,使用微博账号即可。

1.准备操作:
登录http://open.weibo.com, 登录你的微博帐号, 如果点击登录没有反应的话, 就先在http://www.weibo.com中登录一下, 然后就可以了.

填写基本信息, 邮箱一定要写正确的, 因为稍后要验证.

邮箱认证成功之后, 就可以正式开始进入我们的主题了

2.创建应用(以移动应用为例)
点击微连接, 创建移动应用, 点击立即接入, 如果你没有进行身份认证的话, 会有一些提示, 这对我们没有影响, 点击继续创建即可

创建好应用之后, 点击左侧的高级信息, 输入授权回调页面, 两个网址最好不一样, 用来测试是否连接成功.
在测试信息里, 输入另一个微博账号, 进行关联, 也可以不设, 但是还是建议写上为好

3.查看API文档
点击导航栏处的文档, 然后选择API文档
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

我们需要获取AppKey 和 授权回调地址, 然后和上面URL进行拼接

4.获取参数, 拼接URL
找到刚刚创建的应用, 点击基本信息, 里面有我们需要的App Key 和 App Secret(这个后面会用到)
这里写图片描述
这里写图片描述

然后就可以进行拼接了, 记住最好直接复制, 不要手写, 很容易出错. URL后面加 ‘?’ 参数名就是必选参数的参数名, 直接复制就好, 等号两边不要加空格. 参数之间用 ‘&’ 连接
拼接格式: URL?参数名=参数&参数名=参数

把拼接后的网址复制到浏览器中进行测试, 能打开你的授权回调页面代表没有问题. 有的人会直接弹到回调页面, 有的人会弹出一个提示框, 问是否授权, 不要太惊讶~

把拼接好的URL给你的webView, 就可以在app中进行访问了

5.截取code
当我们看到回调页面的时候, 代表我们上一步成功了. 此时URL里面会含有code, 我们需要做的就是把code截取出来

给webView设置一个代理, 实现它的代理方法

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {            print(request.URL)     return true}

当我们进行网络加载的时候, 都会调用这个方法, 打印URL, 当授权成功的时候, 打印的URL就会看到里面有一个code, 我们要做的就是截取它

要截取code, 首先需要找到code所在的URL, 经过观察不难发现, 含有code的URL, 前面都含有我们的回调网址, 所以我们可以经过判断来筛取我们所需要的URL

if let urlString = request.URL?.absoluteString {        if urlString.hasPrefix(AppRedirectURL) {            print("这个网址有code")            print(urlString)        } }

此时打印出来的URL能很明显的看到code. 你可以自己手动截取, 但是swift中提供了一个query属性, 它能直接帮我们获取到等号后面的内容

if let query = request.URL?.query {                        let startIndex = "code=".endIndex    let code = query.substringFromIndex(startIndex)    print(code)}

此时code就截取成功了, 完整的代码如下

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {  if let urlString = request.URL?.absoluteString {    if urlString.hasPrefix(AppRedirectURL) {       if let query = request.URL?.query {         let startIndex = "code=".endIndex         let code = query.substringFromIndex(startIndex)         print(code)         }       }  }

6.获取Token

func loadToken(code: String) {    let parameter = ["client_id": AppKey, "client_secret": AppSecret, "grant_type": "authorization_code", "code": code, "redirect_uri": AppRedirectURL]        LCNHTTPClient.shareInstance.POST("https://api.weibo.com/oauth2/access_token", parameters: parameter, progress: nil, success: { (_, json) -> Void in        // 成功的回调                    print(json)        }) { (_, error) -> Void in             // 失败的回调            print(error)    }}

第一句是根据API文档拼接的参数, 我的value值大部分都是在外界定义好的
第二句是调用的管理者发送的AFN请求

如果能够成功的回调, 获取到的json就是从网络上获取的数据, 打印出来能看到一些参数.

最后再把json字典转模型, 然后得到的Token, 就可以根据Token去获取信息了

这就完成了Oauth的认证过程

0 0