問:iOS集成OAuth登錄分幾步?web
答:和把大象放冰箱裏同樣。session
第一步:打開webview,跳轉到登錄頁面:app
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中,使用post
func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {}方法獲取返回的code, 再經過code獲取accessToken:url
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關了:spa
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. 是否是很簡單?!code