はじめに
iOSアプリにログイン機能を入れる場合、「Google」や「Github」、「Facebook」等でのログインを用いたOauth認証を使用することがあるかと思います。
このときに「OAuthSwift」のライブラリーを使用する方法もあるかと思いますが、「ASWebAuthenticationSession」を使用する方法を紹介します。
※ iOS11以上では、Cookie等のデータがSafariとは共有できなくなりました。
iOS11では「SFAuthenticationSession」が新しく提供されましたが、iOS12ではdeprecatedとなり「ASWebAuthenticationSession」に置き換わりました。
実装方法
-
URLスキームを設定します
[info] - [URL Types]- [identifire] Bundle Identifier を入れるのが一般的ですが、一意になれば何でも良いようです
- [URL Schemes] URLスキーム
-
アプリケーションを登録します
(Qiitaの場合:Qiitaにログインして、下記のようにアプリケーションを登録します)
[設定] - [アプリケーション] - [アプリケーションを登録する]
※ リダイレクト先のURLには、アプリのURLスキーム://hogehogeのように設定をします。 -
コード
例として、取得した認可コードを表示しています。
import UIKit
import AuthenticationServices
class ViewController: UIViewController {
var session: ASWebAuthenticationSession?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let url = URL(string: "https://qiita.com/api/v2/oauth/authorize?<発行されたClient ID>&scope=<要求するスコープ>&state=<認可後にリダイレクトするURLのクエリに含める値>")!
self.session = ASWebAuthenticationSession(url: url, callbackURLScheme: nil) { url, error in
print(url) // <登録したリダイレクト先のURL>?token=XXXXXXXXXXXXXX
}
session?.start()
}
}
まとめ
iOSでOAuthを使用したログインを実装する場合、「OAuthSwift」のライブラリーを使用する方法があります。しかし「ASWebAuthenticationSession」での実装もシンプルですし、ライブラリー依存がなくなるので、こちらの方が良いかと思います。
今回紹介した方法で「認可コード」を取得できました。
この「認可コード」を「クライアントID」「クライアントシークレット」と一緒に、トークン発行のエンドポイントにリクエストを投げれば、「アクセストークン」が取得できます。
Oauth2のフローを理解するには、下記が参考になりました。
https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f
参考
https://qiita.com/api/v2/docs
https://blog.fenrir-inc.com/jp/2017/11/sfauthenticationsession.html
https://qiita.com/koogawa/items/55a7405c2c323a8f413a
https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f