ここでは、iOSアプリケーションでOAuth2.0に従ったGoogleサインインを実現する方法について以下の流れで解説します。
- Googleサインインに必要なライブラリの導入
- OAuthクライアントIDの取得
- URLスキーマの追加
- サインインの実装
- サインインボタンの追加
- サインアウトの実装
参考
Start integrating Google Sign-In into your iOS app
環境
Mac : 10.11.7(macOS Ctalina)
Xcode: 11.7
Swift: 5.2.4
Googleサインインに必要なライブラリの導入
iOSのライブラリ管理ツールCocoaPodsを使ってGoogleサインインに必要なライブラリを導入します。
1.プロジェクトに移動する
2.Podfileを作成する
3.Podfileにプロジェクトで使用するライブラリを追加する
今回は以下を追加します。
4.ライブラリをインストールする
OAuthクライアントIDの取得
GoogleAPIコンソールでプロジェクトを作成します。
次に、そのプロジェクトに対するOAuth 2.0クライアントIDを取得します。
OAuth 2.0クライアントIDには、iOSのURLスキームが作成されます。
URLスキーマの追加
XcodeのプロジェクトのTARGETSにあるInfo画面を開き、その中のURL Typesにプロパティを追加し、プロパティのUML Schemesに上記iOSのURLスキームを設定します。
サインインの実装
サインインプロセスを以下の手順で実装します。
GIDSignInDelegateプロトコルの実装
各アプリケーション独自の型(クラスなど)に実装してもよいですが、AppDelegateに実装するのが簡単です。
…
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {
GIDSignInの初期化とGIDSignInDelegateの設定
AppDelegateのapplication:didFinishLaunchingWithOptionsメソッドに以下を実装します。
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Initialize sign-in
GIDSignIn.sharedInstance().clientID = “YOUR_CLIENT_ID”
GIDSignIn.sharedInstance().delegate = self
return true
}
ここでは、GIDSignInを初期化し、GIDSignInにGIDSignInDelegateを設定しています。
URLを扱うためのメソッドの実装
AppDelegateに、認可サーバーによる認可プロセス終了時点のURLをアプリケーションが扱うためのメソッドを実装します。
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
return GIDSignIn.sharedInstance().handle(url)
}
アプリケーションをiOS8および、それより古いOSでも動かしたい場合は以下も実装します。
open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return GIDSignIn.sharedInstance().handle(url)
}
GIDSignInDelegateによるサインインの実装
AppDelegateにサインインプロセスを実装します。
withError error: Error!) {
if let error = error {
if (error as NSError).code == GIDSignInErrorCode.hasNoAuthInKeychain.rawValue {
print(“The user has not signed in before or they have since signed out.”)
} else {
print(“\(error.localizedDescription)”)
}
return
}
// Perform any operations on signed in user here.
let userId = user.userID // For client- side use only!
let idToken = user.authentication.idToken // Safe to send to the server
let fullName = user.profile.name
let givenName = user.profile.givenName
let familyName = user.profile.familyName
let email = user.profile.email
// …
}
ここでは、まだ一度もサインインしていないか、サインアウトしてからサインインしていないという状況の検出をしています。
また、サインインしたユーザーに対する操作は、ここに実装します。
また、以下のように、ユーザーとの通信が切断された場合に行うべき操作も実装することができます。
withError error: Error!) {
// Perform any operations when the user disconnects from app here.
// …
}
なお、サインイン(signIn)したとき、または、前のサインインを復元する(restorePreviousSignIn)のとき認可サーバーからアクセストークンが取得されます。
サインインボタンの追加
ユーザーがサインできるようにサインボタンを追加します。
まず、GIDSignInにViewControllerを設定します。
ここでは、GIDSignInにSceneDelegateのrootViewControllerを設定し、
GIDSignInに、必要に応じて前のサインインを復元する処理(restorePreviousSignIn)を設定しています。
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
// MARK: -Google SignIn
// Set presentingViewControll to rootViewController
GIDSignIn.sharedInstance().presentingViewController = window.rootViewController
// Automatically sign in the user.
GIDSignIn.sharedInstance()?.restorePreviousSignIn()
window.makeKeyAndVisible()
}
次に、GIDSignInButtonを設定します。
ここでは、SwiftUIでUIKitのGIDSignInButtonを作成する例を示します。
func makeUIView(context: Context) -> GIDSignInButton {
let button = GIDSignInButton()
button.colorScheme = .light
return button
}
func updateUIView(_ uiView: UIViewType, context: Context) {}
}
サインアウトの実装
サインアウトしたい場合、以下のコードを実装します。
以上、今回は、Google Sign-inの実装について解説しました。