AlamofireOAuth1 is an OAuth1 library based on Alamofire for iOS.
AlamofireOAuth1 is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'AlamofireOAuth1'
You don't have much choices for OAuth1 library based on Swift, OAuthSwift maybe the best(and the only) one. However, it's kind of huge(if you just need OAuth1 or OAuth 2). Moreover, you have to call oauthswift.client
to make a signed request(while you have already had a HTTPClient based on Alamofire).
// create an instance directly
let oauth1 = OAuth1(key: "********",
secret: "********",
requestTokenUrl: "http://fanfou.com/oauth/request_token",
authorizeUrl: "http://fanfou.com/oauth/authorize",
accessTokenUrl: "http://fanfou.com/oauth/access_token",
callbackUrl: "alamofire-oauth1://callback")
// or instantiate with OAuth1Settings(see OAuth1Settings.swift.example)
let oauth1 = OAuth1()
// by default the authorized URL is opened in Safari
// you can make a SafariOpenURLHandler to use the SFSafariViewController
// the idea is inspired by OAuthSwift
let handler = SafariOpenURLHandler(viewController: self)
oauth1.authorizeURLHandler = handler
// fetch access token
oauth1.fetchAccessToken(accessMethod: .get, successHandler: { (accessToken) in
// handle with accessToken
}, failureHandler: errorHandler)
Don't forget to register your application to launch from a custom URL scheme. In this case, the URL scheme is alamofire-oauth1://callback
(based on the callbackUrl
).
Handle the custom URL scheme on iOS with handleCallback
:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if url.host == "alamofire-oauth1", url.path.contains("callback") {
OAuth1.handleCallback(callbackURL: url)
}
return true
}
// OAuth1TokenStore is built on the top of KeychainAccess
// save token
oauth1.fetchAccessToken(accessMethod: .get, successHandler: { (accessToken) in
OAuth1TokenStore.shared.saveToken(accessToken, withIdentifier: self.tokenId)
}, failureHandler: errorHandler)
// retrieve token
let accessToken: OAuth1Token = try OAuth1TokenStore.shared.retrieveCurrentToken(withIdentifier: tokenId)
RequestAdapter
is a new feature in Alamofire 4. It allows eachRequest
made on aSessionManager
to be inspected and adapted before being created, making it easy to append anAuthorization
header to requests.
- Authorize and request with
APIClient
:
// create a Router
// see Routing Requests: https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests
enum Router: URLRequestConvertible {
case fanfou
case twitter
func asURLRequest() throws -> URLRequest {
return ...
}
}
// APClient has adopted RequestAdapter.
func testTwitter() {
let oauth1 = OAuth1(key: "YOUR-TWITTER-CONSUMER-KEY",
secret: "YOUR-TWITTER-CONSUMER-SECRET",
requestTokenUrl: "https://api.twitter.com/oauth/request_token",
authorizeUrl: "https://api.twitter.com/oauth/authorize",
accessTokenUrl: "https://api.twitter.com/oauth/access_token",
callbackUrl: "https://alamofireoauth1redirect.herokuapp.com/")
let client = APIClient(with: oauth1)
client.authorize(with: SafariURLOpener(viewController: self)) {
client.request(Router.twitter).validate().responseJSON(completionHandler: { (response) in
debugPrint(response.result)
})
}
}
- Implement your adapter with
adaptRequest:withAccessToken
function
open func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
let accessToken = try OAuth1TokenStore.shared.retrieveCurrentToken(withIdentifier: tokenId)
return try oauth1.adaptRequest(urlRequest, withAccessToken: accessToken)
}
To run the example project, clone the repo, and run pod install
from the Example directory first. ViewController.swift shows the process of authenticating against Twitter and Fanfou(饭否).
AlamofireOAuth1 is available under the MIT license. See the LICENSE file for more info.