国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS Moya實現OAuth請求的方法

2019-10-21 18:22:01
字體:
來源:轉載
供稿:網友

0. 起源

開放授權(OAuth)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯系人列表),而無需將用戶名和密碼提供給第三方應用。

而作為第三方軟件,為用戶提供 OAuth 登錄是更好的選擇,可以有效打消用戶對于個人賬戶密碼泄露的顧慮,同時也能有效避免用戶反復登錄,進而增加用戶的舒適度,提高用戶粘性。

1. 環境

項目使用 MVVM 架構,引入了 Rx 全家桶,網絡請求框架使用了 Moya ,以及處理 Oauth 相關的庫 OAuth2 

2. OAuth2 部分

參閱 OAuth2 庫的 README ,完成 OAuth 的信息配置:

let oauth2 = OAuth2CodeGrant(settings: [  "client_id": "my_swift_app",  "client_secret": "C7447242",  "authorize_uri": "https://github.com/login/oauth/authorize",  "token_uri": "https://github.com/login/oauth/access_token",  "redirect_uris": ["myapp://oauth/callback"],  "scope": "user repo:status",  "secret_in_body": true,  "keychain": false,] as OAuth2JSON)

同時因為 Moya 的底層網絡請求實現是基于 Alamofire,因此我們可以參照 OAuth2 提供的說明文檔 Alamofire 4 · p2/OAuth2 Wiki · GitHub 完成相關配置,關鍵代碼如下:

import Foundationimport OAuth2import Alamofireclass OAuth2RetryHandler: RequestRetrier, RequestAdapter {    let loader: OAuth2DataLoader    init(oauth2: OAuth2) {    loader = OAuth2DataLoader(oauth2: oauth2)  }    /// Intercept 401 and do an OAuth2 authorization.  public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {    if let response = request.task?.response as? HTTPURLResponse, 401 == response.statusCode, let req = request.request {      var dataRequest = OAuth2DataRequest(request: req, callback: { _ in })      dataRequest.context = completion      loader.enqueue(request: dataRequest)      loader.attemptToAuthorize() { authParams, error in        self.loader.dequeueAndApply() { req in          if let comp = req.context as? RequestRetryCompletion {            comp(nil != authParams, 0.0)          }        }      }    }    else {      completion(false, 0.0)  // not a 401, not our problem    }  }    /// Sign the request with the access token.  public func adapt(_ urlRequest: URLRequest) throws -> URLRequest {    guard nil != loader.oauth2.accessToken else {      return urlRequest    }    return try urlRequest.signed(with: loader.oauth2)  // "try" added in 3.0.2  }}

3. Moya 部分

Moya 的 provider 在初始化時可以傳入 SessionManager ,因此參照文檔,可以先使用 OAuth2 生成一個特定的 SessionManager :

func getManager() -> SessionManager {    let oauth2 = OAuth2CodeGrant(settings: [      "client_id": "my_swift_app",      "client_secret": "C7447242",      "authorize_uri": "https://github.com/login/oauth/authorize",      "token_uri": "https://github.com/login/oauth/access_token",      "redirect_uris": ["myapp://oauth/callback"],      "scope": "user repo:status",      "secret_in_body": true,      "keychain": false,      ] as OAuth2JSON)    let sessionManager = SessionManager()    let oauthHandler = OAuth2Handler(oauth2: oauth2)    sessionManager.adapter = oauthHandler    sessionManager.retrier = oauthHandler    return sessionManager  }

進而生成帶 OAuth 的 provider:

fileprivate lazy var provider: MoyaProvider = {  return MoyaProvider<API>(manager: self.getManager(),              plugins: [NetworkLoggerPlugin()])}()

使用

使用生成的 provider 發送請求即可,此時 Moya 可自動處理 OAuth 認證信息。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西充县| 昔阳县| 榕江县| 黔江区| 兴隆县| 德州市| 金寨县| 福海县| 夏邑县| 嫩江县| 六枝特区| 鄯善县| 城市| 香河县| 内丘县| 温宿县| 武宣县| 濮阳市| 木兰县| 根河市| 砀山县| 潜山县| 汕尾市| 讷河市| 高唐县| 左贡县| 武清区| 瓦房店市| 余姚市| 梅州市| 贵港市| 勐海县| 宣武区| 搜索| 怀化市| 汤原县| 桐城市| 万荣县| 三门县| 武隆县| 临夏县|