今回は、Firebase に匿名ユーザーとして認証(サインイン)する方法について解説します。
匿名でのログインを行うことで、所謂「仮ユーザー」としてアプリを利用することができるようになります。
例えば、ECアプリでのショッピングカードへの保存やお気に入りの保存などをメールアドレス等の情報入力せずに利用させることができます。
また、アプリにメールアドレス等で会員登録した際に、匿名ユーザーを「本会員」として昇格させる手順についても触れたいと思います。
Firebase Authentication の iOS 導入手順【⑩匿名ログイン編】
匿名認証プロバイダを有効化
最初に、Firebase コンソール画面で匿名認証プロバイダを許可する設定をします。
[Authentication] > [Sign-in method] から「匿名」を開き、有効化して保存しましょう。匿名ログイン(サインイン)
匿名でログインを行うには Auth.auth().signInAnonymously を呼び出します。
Auth.auth().signInAnonymously() { authResult, error in
guard let user = authResult?.user else {
return
}
print(user.uid)
}
匿名ログインが成功していれば authResult(AuthDataResult) から user(FIRUser)を取得できます。
Firebase コンソール画面に以下のようなユーザーが登録されているはずです。
匿名ユーザーから本ユーザーへの昇格
匿名ユーザーを、メールアドレスとパスワードの認証によってアプリに本ユーザーとして登録するには以下のようにします。
if let user = Auth.auth().currentUser, user.isAnonymous {
let credential = EmailAuthProvider.credential(withEmail: email, password: password)
user?.link(with: credential) { authResult, error in
print(authResult.user?.uid)
}
}
成功していれば、Firebase コンソール画面の匿名ユーザーがメールアドレスプロバイダのユーザーに変わっているはずです。
ユーザーUID が匿名ユーザーの時と同じかどうか確認しましょう。
Google アカウント、Facebook アカウントを使った本ユーザーへの昇格も同様に行うことができます。
Google アカウントで本ユーザー登録
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(
withIDToken: authentication.idToken,
accessToken: authentication.accessToken
)
Auth.auth().currentUser?.link(with: credential) { authResult, error in
print(authResult.user?.uid)
}
Facebook アカウントで本ユーザー登録
let credential = FacebookAuthProvider.credential(
withAccessToken: AccessToken.current!.tokenString
)
Auth.auth().currentUser?.link(with: credential) { authResult, error in
print(authResult.user?.uid)
}
以上
一連の記事を拝見させていただき、非常に参考になりました! ありがとうございました
Nさん
コメントありがとうございます。
ご参考となりましたこと嬉しく思います。
今後ともサイトを充実させて行きますので、時々訪れて頂けると嬉しいです!
参考になります。ありがとうございます。
一点教えていただきたいのですが
匿名認証からGoogleサインインを行い、本ユーザーに昇格させる際に
user?.link(with: credential) { authResult, error in
print(authResult.user?.uid)
}
この部分でエラーが出ます。
エラー:Value of type ‘GIDGoogleUser’ has no member ‘link’
公式のドキュメントにも同様に記載されており・・、解決の方法を御存知でしたらお教えください。
よろしくお願いいたします。
koshibanbi さん
コメントありがとうございます。
user?.link でエラーとのことですが、ここでの user は GIDGoogleUser の user ではなく、Auth.auth().currentUser の user になります。
記載の内容だとわかりにくかったと思いますので後ほど修正致します。
以下のような流れであればエラーにならないはずです。
guard let authentication = user.authentication else { return }
let credential = GoogleAuthProvider.credential(
withIDToken: authentication.idToken,
accessToken: authentication.accessToken
)
if let currentUser = Auth.auth().currentUser {
currentUser.link(with: credential) { authResult, error in
print(authResult.user?.uid)
}
}