热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

iOSMoya实现OAuth请求的方法

这篇文章主要介绍了iOSMoya实现OAuth请求的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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 Foundation
import OAuth2
import Alamofire


class 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(manager: self.getManager(),
              plugins: [NetworkLoggerPlugin()])
}()

使用

使用生成的 provider 发送请求即可,此时 Moya 可自动处理 OAuth 认证信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本报告涵盖了个人博客账号和码云账号的注册过程,以及对网络工程专业学习的反思与展望。通过回顾初入大学时的专业选择,分析当前的专业知识和技能水平,并对未来的职业规划进行了详细讨论。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 本文详细解析了如何使用Python的urllib模块发起POST请求,并通过实例展示如何爬取百度翻译的翻译结果。 ... [详细]
  • 提升Tumblr爬虫效率与功能
    本文介绍了对之前开发的Tumblr爬虫脚本进行升级,整合了两个脚本的功能,实现了自动分页爬取博客内容,并支持配置文件以下载多个博客的不同格式文件。此外,还优化了图片下载逻辑。 ... [详细]
author-avatar
mikewuhan_689
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有