OAuthSwift 2.2.0

OAuthSwift 2.2.0

测试测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2021年5月
SPM支持 SPM

dongriDongri JinphimageBen Chatelain 维护。



OAuthSwift

OAuthSwift

基于 Swift 的用于 iOS 和 macOS 的 OAuth 库。

支持 OAuth1.0、OAuth2.0

Twitter、Flickr、Github、Instagram、Foursquare、Fitbit、Withings、Linkedin、Dropbox、Dribbble、Salesforce、BitBucket、GoogleDrive、Smugmug、Intuit、Zaim、Tumblr、Slack、Uber、Gitter、Facebook、Spotify、Typetalk、SoundCloud 等

安装

OAuthSwift被打包为 Swift 框架。目前,这是将其添加到您应用程序的最简单方式

  • 将 OAuthSwift.xcodeproj 拖到 Project Navigator 中的您的项目。
  • 选择您的项目,然后选择您的应用程序目标。打开构建阶段面板。
  • 展开目标依赖项组,并添加 OAuthSwift 框架。
  • 在您想使用 OAuthSwift 时导入 OAuthSwift。

支持Carthage

github "OAuthSwift/OAuthSwift" ~> 2.0.0
  • 运行carthage update
  • 在应用程序目标的“常规”设置选项卡中,在“嵌入的二进制文件”部分,从磁盘上的Carthage/Build/iOS文件夹中拖放OAuthSwift.framework。

支持CocoaPods

  • Podfile
platform :ios, '10.0'
use_frameworks!

pod 'OAuthSwift', '~> 2.0.0'

旧版本

swift 3

使用swift3分支,或者在主分支上的标签1.1.2

swift 4

在第9条横幅上的标签1.2.0

objective c

在第4条横幅上的标签1.4.1

如何

设置 URL 方案

在您的目标应用的“信息”标签页中图像用您的应用程序名称替换 oauth-swift

在 AppDelegate 中处理 URL

  • 在 iOS 中实现 UIApplicationDelegate 方法
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey  : Any] = [:]) -> Bool {
  if (url.host == "oauth-callback") {
    OAuthSwift.handle(url: url)
  }
  return true
}

⚠️其他应用程序可能尝试使用您的 URL 方案打开 URL。因此,您可以检查源应用程序,例如对于 safari 控制器

if (options[.sourceApplication] as? String == "com.apple.SafariViewService") {
  • 在 macOS 上,您必须在 NSAppleEventManager 上注册一个处理程序来处理事件类型 kAEGetURL(见示例代码)
func applicationDidFinishLaunching(_ aNotification: NSNotification) {
    NSAppleEventManager.shared().setEventHandler(self, andSelector:#selector(AppDelegate.handleGetURL(event:withReplyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
}
func handleGetURL(event: NSAppleEventDescriptor!, withReplyEvent: NSAppleEventDescriptor!) {
    if let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue, let url = URL(string: urlString) {
        OAuthSwift.handle(url: url)
    }
}

使用 OAuth1.0 授权

// create an instance and retain it
oauthswift = OAuth1Swift(
    consumerKey:    "********",
    consumerSecret: "********",
    requestTokenUrl: "https://api.twitter.com/oauth/request_token",
    authorizeUrl:    "https://api.twitter.com/oauth/authorize",
    accessTokenUrl:  "https://api.twitter.com/oauth/access_token"
)
// authorize
let handle = oauthswift.authorize(
    withCallbackURL: URL(string: "oauth-swift://oauth-callback/twitter")!) { result in
    switch result {
    case .success(let (credential, response, parameters)):
      print(credential.oauthToken)
      print(credential.oauthTokenSecret)
      print(parameters["user_id"])
      // Do your request
    case .failure(let error):
      print(error.localizedDescription)
    }             
}

OAuth1 无授权

此处无需指定 URL

// create an instance and retain it
oauthswift = OAuth1Swift(
    consumerKey:    "********",
    consumerSecret: "********"
)
// do your HTTP request without authorize
oauthswift.client.get("https://api.example.com/foo/bar") { result in
    switch result {
    case .success(let response):
        //....
    case .failure(let error):
        //...
    }
}

使用 OAuth2.0 授权

// create an instance and retain it
oauthswift = OAuth2Swift(
    consumerKey:    "********",
    consumerSecret: "********",
    authorizeUrl:   "https://api.instagram.com/oauth/authorize",
    responseType:   "token"
)
let handle = oauthswift.authorize(
    withCallbackURL: URL(string: "oauth-swift://oauth-callback/instagram")!,
    scope: "likes+comments", state:"INSTAGRAM") { result in
    switch result {
    case .success(let (credential, response, parameters)):
      print(credential.oauthToken)
      // Do your request
    case .failure(let error):
      print(error.localizedDescription)
    }
}

使用 OAuth2.0 和密钥证明流(PKCE)进行授权

// create an instance and retain it
oauthswift = OAuth2Swift(
    consumerKey:    "********",
    consumerSecret: "********",
    authorizeUrl: "https://server.com/oauth/authorize",
    responseType: "code"
)
oauthswift.accessTokenBasicAuthentification = true

let codeVerifier = base64url("abcd...")
let codeChallenge = codeChallenge(for: codeVerifier)

let handle = oauthswift.authorize(
    withCallbackURL: URL(string: "myApp://callback/")!,
    scope: "requestedScope", 
    state:"State01",
    codeChallenge: codeChallenge,
    codeChallengeMethod: "S256",
    codeVerifier: codeVerifier) { result in
    switch result {
    case .success(let (credential, response, parameters)):
      print(credential.oauthToken)
      // Do your request
    case .failure(let error):
      print(error.localizedDescription)
    }
}

请参见示例代码以获取更多示例

处理授权 URL

授权 URL 允许用户连接到服务提供商,并授予您的应用访问权限。

默认情况下,此 URL 将在外部 Web 浏览器(例如 Safari)中打开,但苹果不允许在 app-store 的 iOS 应用中使用。

要更改此行为,您必须设置一个 OAuthSwiftURLHandlerType,这是一个简单的协议,用于处理一个 URL

oauthswift.authorizeURLHandler = ..

例如,您可以将网页视图嵌入到您的应用中,通过提供显示网页视图(UIWebViewWKWebView)的控制器。然后,此控制器必须实现 OAuthSwiftURLHandlerType 以将 URL 加载到网页视图中

func handle(_ url: NSURL) {
  let req = URLRequest(URL: targetURL)
  self.webView.loadRequest(req)
  ...

并显示视图(present(viewControllerperformSegue(withIdentifier: ,...您可以为默认的视图呈现和关闭扩展 OAuthWebViewController

使用 SFSafariViewController(iOS9)

使用 SFSafariViewController 提供了 OAuthSwiftURLHandlerType 的默认实现,包括自动视图关闭。

oauthswift.authorizeURLHandler = SafariURLHandler(viewController: self, oauthSwift: oauthswift)

当然,您可以通过设置变量 SafariURLHandler#factory 来创建自己的类或自定义控制器。

制作签名请求

只需调用 oauthswift.client 的 HTTP 函数即可。

oauthswift.client.get("https://api.linkedin.com/v1/people/~") { result in
    switch result {
    case .success(let response):
        let dataString = response.string
        print(dataString)
    case .failure(let error):
        print(error)
    }
}
// same with request method
oauthswift.client.request("https://api.linkedin.com/v1/people/~", .GET,
      parameters: [:], headers: [:],
      completionHandler: { ...

有关更多示例,请参阅演示应用:ViewController.swift

OAuth 提供商页面

图片

Image Image Image

贡献

CONTRIBUTING.md

在演示应用中添加新的服务

集成

OAuthSwift 可以与其他框架一起使用

您可以使用 Alamofire 的请求与 OAuthSwiftAlamofire 进行签名

为了实现出色的异步代码,您可以使用以下集成框架之一

许可

OAuthSwift 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。

License Platform Language Cocoapod Carthage compatible Build Status