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
- 安装Carthage (https://github.com/Carthage/Carthage)
- 创建Cartfile文件
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
}
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 = ..
例如,您可以将网页视图嵌入到您的应用中,通过提供显示网页视图(UIWebView
,WKWebView
)的控制器。然后,此控制器必须实现 OAuthSwiftURLHandlerType
以将 URL 加载到网页视图中
func handle(_ url: NSURL) {
let req = URLRequest(URL: targetURL)
self.webView.loadRequest(req)
...
并显示视图(present(viewController
,performSegue(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 提供商页面
- Flickr
- Github
- Foursquare
- Fitbit
- Withings
- Dropbox
- Dribbble
- Salesforce
- BitBucket
- GoogleDrive
- Smugmug
- Intuit
- Zaim
- Tumblr
- Slack
- Uber
- Gitter
- Spotify
- Trello
- Buffer
- Goodreads
- Typetalk
- SoundCloud
- Doper
- NounProject
图片
贡献
集成
OAuthSwift 可以与其他框架一起使用
您可以使用 Alamofire 的请求与 OAuthSwiftAlamofire 进行签名
为了实现出色的异步代码,您可以使用以下集成框架之一
许可
OAuthSwift 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。