OAuthSwift で AccessToken 取得
OAuthSwift で Access Token 取得
Doorkeeper - awesome OAuth2 provider for your Rails app. を使った OAuth2 認可を実装したサーバーに対して iOS アプリから実際にアクセストークンの取得を試みる。
OSS でいくつか公開されているライブラリがあるが、GitHub スター数や、更新の活発さ等から以下を選択、使用してみたところ正常にアクセストークンを取得できた。
OAuthSwift/OAuthSwift/ Swift based OAuth library for iOS
Doorkeeper 側の設定
https://YOUR_DOMAIN/oauth/applications
にアクセスし、対象のアプリケーションを選択する。
Callback urls にはこれまで local tests 用の urn:ietf:wg:oauth:2.0:oob
しか入れていなかったので Edit 押下で Redirect URI に追記。
urn:ietf:wg:oauth:2.0:oob sample-app://oauth-callback
なんか命名規則っぽいのはあるのかな。とりあえず付けた感。
Installation
iOS アプリ側に戻る。
今回パッケージ管理には Carthage を使用しているので Support Carthage の通りに。
How to
How to の通りに。
URL Schemes の追加。
AppDelegate.swift
に以下を追記。
import UIKit import OAuthSwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { if (url.host == "oauth-callback") { OAuthSwift.handle(url: url) } return true } ・ ・ ・
とりあえず動作確認用なので、ViewController 上でお試し。
ViewController.swift
に以下を追記。
import UIKit import OAuthSwift class ViewController: UIViewController { let oauthswift = OAuth2Swift( consumerKey: "15afda6f72009b78571150d63f57bc690a436c8e1199c09bc2de05bc63c09f14", consumerSecret: "e590044244da414ece872de0ada52aed33d1cf889d365cb3da4dceed710668b8", authorizeUrl: "https://fierce-wave-40771.herokuapp.com/oauth/authorize", accessTokenUrl: "https://fierce-wave-40771.herokuapp.com/oauth/token", responseType: "code" ) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let handle = oauthswift.authorize( withCallbackURL: URL(string: "sample-app://oauth-callback")!, scope: "", state:"hoge", success: { credential, response, parameters in print(credential.oauthToken) // Do your request }, failure: { error in print(error.localizedDescription) } ) } ・ ・ ・
実行すると、
- お試しアプリが起動
- (上記 ViewController に記載した OAuthSwift の処理で) Safari に自動遷移
- Safari 側でログイン処理を実施
- (Redirect URL に飛ぶ際 URL Schemes を使って)お試しアプリに自動遷移
print(credential.oauthToken)
の行でアクセストークンが取得できていることが確認できる
となる。
成功だ。
その他
テストについてちょっと考えていたが、このあたり Facebook はよくできているなと感じた。
まー Web API へのリクエストからしてそもそもモックにすることで unit test は可能か。