はじめに
FirebaseのSNS認証には、ポップアップウィンドウを表示するポップアップモードとログインページにリダイレクトするリダイレクトモードの2種類の形式があります。
今回は、後者のリダイレクトモードの実装方法について説明します。
環境
ハイブリットモバイルアプリ用フレームワークであるIonic(Angular)とFirebaseを使用してアプリを作成しています。
- firebase@7.21.1
$ ionic info
コマンドの実行結果
$ ionic info Ionic: Ionic CLI : 6.11.8 (/usr/local/lib/node_modules/@ionic/cli) Ionic Framework : @ionic/angular 5.3.3 @angular-devkit/build-angular : 0.1000.8 @angular-devkit/schematics : 10.0.8 @angular/cli : 10.0.8 @ionic/angular-toolkit : 2.3.3 Capacitor: Capacitor CLI : 2.4.1 @capacitor/core : 2.4.1 Utility: cordova-res : not installed native-run : not installed System: NodeJS : v12.13.1 (/usr/local/bin/node) npm : 5.6.0 OS : macOS Catalina
リダイレクトモードでFirebase認証
FirebaseのTwitter認証をリダイレクトモードで実装していきます。なお、モバイルデバイスの認証ではポップアップモードではなくリダイレクトモードが推奨されています。
リダイレクトモードでは、signInWithRedirect
を呼び出します。Twitter認証後(リダイレクト後)には、getRedirectResult
が呼び出されます。
下記のコードはFirebase認証を呼び出すサービスクラスです。ログイン画面から呼び出されます。
authentication.service.ts
export class AuthenticationService { constructor(public afAuth: AngularFireAuth) {} /** * Twitter認証を呼び出す。 * 認証成功時にリダイレクトする。 * * @returns {Promise<void>} * @memberof AuthenticationService */ public signInWithTwitter(): Promise<void> { return this.afAuth.signInWithRedirect( new firebase.auth.TwitterAuthProvider() ); } /** * リダイレクト後の処理。 * * @returns {Promise<firebase.auth.UserCredential>} * @memberof AuthenticationService */ public getRedirectResult(): Promise<firebase.auth.UserCredential> { return this.afAuth.getRedirectResult(); } }
下記のコードはログイン画面のコンポーネントクラスです。
login.page.ts
export class LoginPage implements OnInit { constructor( private authenticationService: AuthenticationService, private router: Router ) {} ngOnInit() { this.getRedirectResult(); } /** * Twitterで認証する。 * * @memberof LoginPage */ public async signInWithTwitter() { await this.authenticationService.signInWithTwitter(); } /** * リダイレクト後に呼び出される処理。 * * @private * @memberof LoginPage */ private async getRedirectResult() { const result: firebase.auth.UserCredential = await this.authenticationService.getRedirectResult(); try { if (result.user != null) { this.router.navigate(['/weight/tabs/tab1']); } } catch (error) { console.log(error); } } }
上記のコードで行っているのは、下記の内容です。
- ユーザーが
signInWithTwitter()
でログインします。 - Twitter でログインを行うため、
signInWithRedirect()
メソッドによってリダイレクトがトリガーされます。 - Twitterログインをすると、ユーザーはログイン画面のコンポーネントに戻されます。
- ユーザーのログインは、ログイン画面の
ngOnInit()
内のgetRedirectResult()
で返される Promise によって解決されます。 navigate()
メソッドで、ルーターがユーザーを/weight/tabs/tab1
に移動させます。
ポップアップモードのFirebase認証
ポップアップモードによるFirebaseのTwitter認証は下記の記事を参照してください。
Angular + Firebase でTwitter認証 - 中安拓也のブログ
参考サイト
JavaScript で Google ログインを使用して認証する | Firebase
Google Developers Japan: Angular コンポーネントから Route 特有のコードを綺麗にする