随着网络的发展, 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的认证过程