瑞雪年

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::
  261 随笔 :: 0 文章 :: 432 评论 :: 0 引用

问:iOS集成OAuth登陆分几步?

答:和把大象放冰箱里一样。

第一步:打开webview,跳转到登陆页面:

        let url = "https://auth.dxy.cn/conn/oauth2/authorize?clientId=xxx&state=xxx&responseType=code&redirectUri=xxx”
        webView.loadRequest(NSURLRequest(URL: NSURL(string:url)!))

第二步:在AppDelegate中,使用

func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {}方法获取返回的code, 再通过code获取accessToken:

        let requestUrl = NSURL(string: "https://auth.dxy.cn/conn/oauth2/accessToken")
        let postData =  "clientId=xxx&clientSecret=xxx&grantType=authorizationCode&redirectUri=xxx&code=\(code)"
         let request = NSMutableURLRequest(URL: requestUrl!)
        request.HTTPMethod = "POST"
        request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)

第三步:通过accessToken获取用户信息,再捎带把webview关了:

let getUserInfoRequestUrl = NSURL(string: "https://auth.dxy.cn/conn/oauth2/profile")
let getUserInfoPostData = "accessToken=\(access_token)"
                            
let getUserInfoRequest = NSMutableURLRequest(URL: getUserInfoRequestUrl!)
getUserInfoRequest.HTTPMethod = "POST"
getUserInfoRequest.HTTPBody = getUserInfoPostData.dataUsingEncoding(NSUTF8StringEncoding)
                        
let getUserInfoDataTask = session.dataTaskWithRequest(getUserInfoRequest,
            completionHandler: {(data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
                  if error != nil {
                      print(error?.code)
                      print(error?.description)
                  }
                  else    {
                     let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
                     do{
                        let userInfoResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())
                        let id = userInfoResult["id"] as? String

                        let viewController = self.window?.rootViewController as! ViewController
                        viewController.id = id
                        viewController.closeWebView()
                     }
                     catch {}
                 }
       })
                            
getUserInfoDataTask.resume()

 

Ok, That's it. 是不是很简单?!

posted on 2015-12-21 21:27 瑞雪年 阅读(...) 评论(...) 编辑 收藏