[go: up one dir, main page]

この記事は David East、デベロッパー アドボケートによる The Firebase Blog の記事 "Cleanse your Angular components of Route specific code" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

認証コンポーネントを構築するとき、ストレスを感じることがよくあります。非同期フローは管理しにくく、テンプレートは ngIf と Elvis 演算子で乱雑になってしまいます。
{{ (user | async)?.uid }}

ここで問題になることは、いつも同じです。あまりにも多くのことを 1 か所に詰め込みすぎているのです。適切なコードを適切な場所に配置するように整理すれば、快適なコードベースにすることができます。

解決策: ルーティング特有のコードは、Angular の Route Guard に保存します。

ステップ 1: コンポーネントの Route コードを特定する


AngularFireAuth サービスは、ルーティングのコードとの相性が抜群です。この中には、現在のユーザーについての情報や、リダイレクトされたのかどうかなど、あらゆる情報が含まれています。

単純な signInWithRedirect の例を見てみましょう。
import { Component, OnInit } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import { Router } from '@angular/router';
import * as firebase from 'firebase/app';

@Component({
  selector: 'app-login',
  template: `
    <button class="btn" (click)="auth()">
       Login
    </button>
  `,
  styleUrls: ['./login.scss']
})
export class LoginComponent implements OnInit {

  constructor(
    private afAuth: AngularFireAuth,
    private router: Router
  ) { }

  ngOnInit() {
    this.afAuth.getRedirectResult().then(result => {
      if(result) {
        this.router.navigateByUrl('profile');
      }
    });
  }

  auth() {
    const provider = new firebase.auth.GoogleAuthProvider();
    this.afAuth.auth.signInWithRedirect(provider); 
  }

}

この例で行っているのは、以下の内容です。
  1. ユーザーが auth() メソッドでログインします。
  2. Google でログインを行うため、signInWithRedirect() メソッドによってリダイレクトがトリガーされます。
  3. アカウントを選択すると、ユーザーはこのコンポーネントに戻されます。
  4. ユーザーのログインは、ngOnInit() 内の getRedirectResult() で返される Promise によって解決されます。
  5. navigateByUrl() メソッドで、ルーターがユーザーをプロフィール ページに移動させます。

コンポーネントが 1 つだけの場合、これでも問題はありません。しかし、複数のコンポーネントでリダイレクトを管理しなければならない場合を考えてみてください。

ngOnInit のコードは、Route Guard に移すことができます。そうすると、ルーティング ロジックのコンポーネントを整理でき、Router への依存性を完全に削除することができます。

ステップ 2: Route Guard の作成


Route Guard には、さまざまな便利な使い方があります。今回は、リダイレクトのコードを扱います。
@Injectable()
export class RedirectGuard implements CanActivate {

  constructor(
    private authService: AngularFireAuth,
    private router: Router
  ) {}

  canActivate() {
    this.authService.auth.getRedirectResult().then(result => {
      if(result.user != null) {
        this.router.navigateByUrl('profile');
        return false;
      }
      return true;
    });
  }

}

canActivate メソッドは、ユーザーがルートにアクセスできるかを判定します。実際には、次のような処理が行われます。
  1. ユーザーがルートを開く。
  2. AngularFireAuth が、リダイレクト結果が存在するかどうかを確認する。
  3. ユーザーがリダイレクトから戻ってきた場合、'profile' ルートにルーティングする。
  4. そうでない場合、現在のルートに移動する。

これで、コードを再利用できるようになります。Angular の Router を使うと、リッスンしてリダイレクトするルートを指定できます。
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { RedirectGuard } from './redirect.guard';

const ROUTES: Routes = [
  { 
    path: '', 
    component: LoginComponent, 
    canActivate: [RedirectGuard] 
  },
  { 
    path: 'profile', 
    loadChildren: 'app/profile/profile.module#ProfileModule'
  }
];

const AppRoutes = RouterModule.forRoot(ROUTES);

export { AppRoutes }

これで、LoginComponent からルーティングのコードをなくすことができます。
@Component({
  selector: 'app-login',
  template: `
     <button class="btn" (click)="auth()">
       Login
     </button>
  `,
  styleUrls: ['./login.scss']
})
export class LoginComponent {

  constructor(private afAuth: AngularFireAuth) { }

  auth() {
    const provider = new firebase.auth.GoogleAuthProvider();
    this.afAuth.auth.signInWithRedirect(provider); 
  }

}

非同期フローで乱雑になることはもうありません。適切なコードが適切な場所に配置されるように整理されたのです。アプリの拡大に合わせて、RedirectGuard に他のルートを追加することもできます。これでコンポーネントが複雑にならずにすみます。


Reviewed by Yoshifumi Yamaguchi - Developer Relations Team

この記事は ソフトウェア エンジニア、Hiranya Jayathilaka による The Firebase Blog の記事 "Managing Users from the Firebase Admin Java SDK" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


Firebase で開発したアプリのデベロッパーや管理者は、さまざまなユーザー管理タスクを実行しなければならないことがあります。たとえば、次のようなものがあげられます。
  • アプリへの新しいユーザー アカウントの登録
  • 既存のユーザー アカウントのアップデート
  • 手動でのユーザー アカウントの検証や有効化
  • ユーザー アカウントの無効化や削除
  • ダッシュボード構築やレポート作成に必要なユーザー プロフィール情報の参照

Firebase Admin SDK には、特権環境からこのようなユーザー管理タスクを実行するための強力な API があります。Admin SDK を使って、管理コンソールやダッシュボード、バックエンド サービスなどに上記の機能を直接組み込むためのプログラムを記述できます。Admin SDK は Firebase クライアント SDK とは異なり、サービス アカウントの認証情報を使って初期化します。これによって、SDK はユーザー管理操作を実行できる特権に昇格できます。

これは新しい機能ではありません。ユーザー管理 API は Firebase Admin Node.js SDK でも提供されていますが、Admin Java SDK のバージョン 5.1.0 以降でもこの API が利用できるようになりました。これは、Admin Java SDK に対して最も多くリクエストが寄せられた機能の 1 つですから、多くの Firebase アプリのデベロッパーに活用していただけるはずです。

Java のユーザー管理 API は、Node.js 版をほぼそのまま反映したもので、具体的には 5 つの新しいメソッドで構成されています。
  • getUser()
  • getUserByEmail()
  • createUser()
  • updateUser()
  • deleteUser()

次のコードは、これらの新しいメソッドを実際に使用する方法を示しています。この例では、既存のユーザー アカウントを受け取り、一部の属性を更新しています。
final FirebaseAuth auth = FirebaseAuth.getInstance();
Task task = auth.getUserByEmail("editor@example.com")
    .addOnSuccessListener(userRecord -> {
      System.out.println("Successfully fetched user data: " + userRecord.getUid());
      UpdateRequest update = userRecord.updateRequest()
          .setDisabled(false)        // Enable the user account
          .setEmailVerified(true); // Set the email verification status
      auth.updateUser(update);
    })
    .addOnFailureListener(e -> {
      System.err.println("Error fetching user data: " + e.getMessage());
    });

Firebase ユーザー管理 API の詳細については、Admin SDK ドキュメントをご覧ください。また、実装方法も知りたい方は、Github レポジトリをご覧ください(ご想像どおり、これはすべてオープンソースです!)。フィードバックや問題の報告を通じて、この API の改善にご協力ください。いつものように、コードベースのプルリクエストなど、あらゆる種類の貢献をお待ちしています。ぜひ Firebase のコーディングをお楽しみください。


Reviewed by Khanh LeViet - Developer Relations Team

この記事は デベロッパー アドボケート、Laurence Moroney による The Firebase Blog の記事 "Firebase Phone Auth" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。  

初めてリリースされたときから、Firebase はさまざまな認証スキームを提供しています。  
ユーザーが基本情報を提供するメールとパスワード認証(iOSAndroidウェブ)を使ったアプリを構築することができます。この場合、Firebase はこれらを ID として利用し、ログインを管理します。また、フェデレーション ID を使うこともできます。この場合、ユーザーがアプリにユーザー登録するのではなく、GoogleFacebookTwitterGitHub などのサードパーティが提供する認証情報を使ってログインします。加えて、登録していないユーザーにセキュリティ ルールを提供する匿名認証を使うこともできます。  
多くのデベロッパーからリクエストされていた認証タイプに、電話番号を使ったログイン機能があります。それを受けて、本日は Firebase Auth で電話番号認証がサポートされたことをお知らせします。現在 Digits SDK を使って電話番号認証を行っている方は、Firebase Auth への移行の詳細が記載されているこちらのお知らせをご覧ください。  
Firebase 電話番号認証は、次のように動作します。  
 
 

ログイン画面


ここに示すのは、Google と Facebook によるフェデレーション ID、メールとパスワードによる基本認証に加えて、電話番号認証をサポートするアプリの例です。  
このアプリは、FirebaseUI を使って構築されています。そのため、本記事で説明するフローの多くは、FirebaseUI を組み込むことによって自動的に実装されます。  
画面の下部を見ればわかるように、電話番号でログインする [Sign in with Phone] オプションが表示されています。  
では、ユーザーがこのボタンをタップするとどうなるかを詳しく見てみましょう。  
 

ログインフロー

ユーザーは、[Sign in with Phone] ボタンを初めてタップした後、端末の電話番号を入力します。[Verify] を押すと番号が Firebase に送信され、6 桁のコードが生成されて SMS 経由で端末に送られます。  

ユーザーが正しいコードを入力すると、Firebase がそれを確認し、ユーザーとして認識します。以降のセッションでは、ログイン状態が維持されます。  
ログイン済みのユーザーは、Firebase コンソールで次のように表示されます。  

Firebase Authentication の詳細は、Firebase デベロッパー サイトをご覧ください。  
Firebase UI は、ログインやユーザー登録のフローのベスト プラクティスをすばやく簡単に実装できるオープンソース ライブラリです。現在、Firebase UI の電話番号認証は iOSウェブで利用できます。近日中に Android にも対応する予定です。  
Firebase と Firebase Authentication の拡大と開発は今後も続いていきます。皆さんのフィードバックをお待ちしていますので、ぜひ firebase.google.com/support までご連絡ください。  

Reviewed by Khanh LeViet - Developer Relations Team

この記事は Laurence Moroney、スタッフ デベロッパー アドボケートによる The Firebase Blog の記事 "Email Verification in Firebase Auth" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Laurence Moroney


Laurence Moroney
Developer Advocate

Google I/O 2016 での初リリース以来、Firebase Auth は、ユーザーがアプリ上でアカウントを作成し、メールアドレスとパスワードを使ってログインする機能を提供してきました。しかし、これまでは、確認プロセスを通して実際のアカウントにメールアドレスがリンクされるわけではなかったため、どのようなアドレスでも使うことができました。そのため、もしユーザーが望むなら、[有名人の名前]@[任意のドメイン] といったアドレスを使ってログインすることも可能でした。

この問題を解決するために、 メール確認 の手順が Firebase Auth に追加されました。先ほどの例では、Firebase により確認用のリンクを含むメールがそのアドレスに送信されることになります。もし本当にその有名人がアプリにユーザー登録しようとしているのであれば、リンク付きのメールが本人に届き、そのリンクをクリックすることでアプリにログインできるようになります。アカウントの確認が完了しているかどうかをログイン時にチェックすれば、必要に応じてログインをブロックするなどの処理を実行できます。
メール確認の詳細
実際の動作を見てみましょう。次のスクリーンショットは、 Firebase Auth クイックスタート(https://github.com/firebase/quickstart-android から入手できます)の画面です。

このアプリを起動して、メールとパスワードによる認証アクティビティを選択すると、次の画面が表示され、ログインするか(すでにアカウントを持っている場合)、アカウントを新規作成するか(まだアカウントを持っていない場合)を選択するよう求められます。


アカウントを作成する [Create Account] ボタンをクリックすると、新しいアクティビティに進み、現在のユーザー ID とそれに紐付けられた Firebase User ID が表示されます。さらに、メールアドレスの確認が完了していないことを示すメッセージと、確認を行うためのボタンも表示されます。


メールアドレスの確認を行う [Verify Email] ボタンをクリックすると、表示されているアドレスにメールが送信されます。このメールにはリンクが含まれ、ユーザーがそのリンクをクリックすると、アカウントの確認が完了します。



このメールの内容は、Firebase コンソールの [Authentication] セクションにある [Email Templates] タブで確認できます。このタブではアクションリンクを編集したり、上の例にある authui-xxxx.firebaseapp.com ではなく、実際のドメインを返信先アドレスで使用することができます。


アカウントの確認が完了してからもう一度ログインすると、画面の表示が次のように変わります。


さらに、Firebase コンソールにこの ID がユーザーとして表示されます。パスワードを変更したり、アプリからユーザーを完全に削除するといった管理作業は、この画面から行えます。


メール確認を行うための実装

メール確認を行うための実装の詳細は、Firebase ドキュメントのユーザーの管理に関するセクション(AndroidiOSウェブ)で参照できます。本投稿の以降の部分では Android のコードについて説明しますが、他のプラットフォームでの実装もほぼ同じです。

中核となる機能は、FirebaseUser オブジェクトに含まれています。そこにある sendEmailVerification() メソッドは、非同期的にメールを送信し、そのステータスを報告する Task を返します。タスクが成功すると、メールが送信されたことが通知されます。次に例を示します。

final FirebaseUser user = mAuth.getCurrentUser();
        user.sendEmailVerification()
                .addOnCompleteListener(this, new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        // Re-enable button
                        findViewById(R.id.verify_email_button).setEnabled(true);

                        if (task.isSuccessful()) {
                            Toast.makeText(EmailPasswordActivity.this,
                                    "Verification email sent to " + user.getEmail(),
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            Log.e(TAG, "sendEmailVerification", task.getException());
                            Toast.makeText(EmailPasswordActivity.this,
                                    "Failed to send verification email.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });

このケースでは、mAuth.getCurrentUser() でユーザーを取得し、そのユーザーに対して sendEmailVerification() メソッドを呼び出しています。このメソッドを実行すると、Firebase によりメールが送信されます。タスクが成功すると、メールが送信されたことを示すトースト通知が表示されます。
ユーザーがメールのリンクをクリックした後に user.isEmailVerified() を呼び出すと true が返されます。サンプルアプリでは、これを次のように使用しています。

mStatusTextView.setText(getString(R.string.emailpassword_status_fmt,
                    user.getEmail(), user.isEmailVerified()));

FirebaseUser オブジェクトはアプリのセッションが続いている間だけキャッシュされる点に注意してください。そのため、ユーザーの確認ステータスをチェックしたいときは、キャッシュをアップデートするために .getCurrentUser().reload() を呼び出すとよいでしょう。

このサンプルアプリでは、ユーザーのメールアドレスが確認済みかどうかをアクティビティで表示しているだけですが、このステータスに応じてアプリの機能を制限したり、ログインが必要なセクションへのアクセスを禁止したりすることも可能です。

Google、Facebook、Twitter などの他のプロバイダを使ったログインなど、Firebase Auth の詳細は Firebase デベロッパー サイトをご覧ください。



Posted by Khanh LeViet - Developer Relations Team