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

首頁 > 系統(tǒng) > iOS > 正文

iOS Moya實現(xiàn)OAuth請求的方法

2020-07-26 02:22:09
字體:
來源:轉載
供稿:網友

0. 起源

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

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

1. 環(huán)境

項目使用 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 的底層網絡請求實現(xiàn)是基于 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 發(fā)送請求即可,此時 Moya 可自動處理 OAuth 認證信息。

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永仁县| 鄱阳县| 昌宁县| 淳化县| 五台县| 通化市| 崇文区| 新安县| 万全县| 阳西县| 米泉市| 沧州市| 锡林郭勒盟| 永济市| 古交市| 化德县| 乌拉特前旗| 汽车| 绥滨县| 东光县| 高雄县| 汨罗市| 峨眉山市| 盐山县| 江津市| 博野县| 九台市| 米泉市| 顺昌县| 沧州市| 明光市| 揭阳市| 土默特左旗| 庄浪县| 黔江区| 都安| 商河县| 永新县| 寿阳县| 永泰县| 宜阳县|