[この記事は Google Identity 製品マネージャーの Steven Soneff による Android Developers Blog の記事 "One tap sign-up and automatic sign-in without password entry using Smart Lock" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]

Android で Netflix アプリにログインするユーザーの 30% 以上は Google の Smart Lock for Passwords のおかげでパスワード入力が不要になりました。詳細はこちらから

Smart Lock for Passwords のリリースから半年が経過し、ユーザーがアプリにログインすることに対して及ぼした効果に、感激しています。1 つの Android 端末から別の Android 端末に、または Chrome から Android に移動する(逆の場合も)に当たり、何百万ものユーザーが、保存済みアカウントを使用してログインしています。対応アプリは 40 以上。最前線のデベロッパーはログインの手間を取り除くことにより、ユーザーの復帰率、収益化のチャンス、デバイスをまたいだ分析性が向上し、アプリの価値とユーザー エクスペリエンスを高めることに成功しました。

New York Times は、新しいログインの 80% が Smart Lock によってサポートされていると見ています。一方で、Netflix のユーザー サポート チームは、Android ユーザーのアカウント復旧に関するサポート事例が 20% 以上減少したことを確認しています。ユーザーは 60% 以上のオプトインで、複数の端末にまたがってログインの状態を維持することを選択し、Smart Lock 対応の主要なアプリのログイン情報を保存しています。デベロッパーの多くは、1 日分に満たない作業で、アプリのクライアント側に変更を加えるだけで、こうしたメリットを得ることができました。Smart Lock for Passwords について詳しくは、開発者用サイトをご覧ください。

新機能

Google Play サービスの最新リリースでは、Smart Lock for Passwords API の機能が強化されており、新規ユーザーのサインアップまたは既存のユーザーのさらに迅速なログインが可能になりました。ログインの「ヒント」を取得する新しい方法を使用すると、タップ 1 回で選択できるメールアドレス一覧がユーザーに対して表示されます。


Android Marshmallow の実行時パーミッション モデルでは、この新しいエクスペリエンスが特に重要です。ユーザー エクスペリエンスを簡素化および向上させるため、このダイアログではいずれの端末からもパーミッションを受け取る必要がありません。また端末に保存されたアカウントに加え、ユーザーが Smart Lock で保存したメールアドレスも表示されます。つまり、ほとんどのユーザーはメールアドレスの入力が不要となります。このダイアログを使用しているアプリは、ユーザーの 4 分の 3 近くが表示されたメールアドレスのいずれかを選択しており、サインアップの割合が増加しています。

ユーザーがメールアドレスを選択した際、サーバー側のサポートもあれば、ログインのフローをさらに改善することができます。メールアドレスを使用してデータベースをチェックし、ユーザーが既にアカウントを登録しているかどうかを確認できます。さらに、事前に入力されたユーザーのメールアドレス、名前、プロファイル写真を使って、ログイン画面またはサインアップ画面をインテリジェントに表示することができます。

パスワード入力を省略する

フローはさらに短縮できます。ユーザーがダイアログから Google アカウントを選択した場合、OpenID Connect の ID トークンが提供されます。これにより、新規アカウントのメールアドレスは検証不要になり、再訪したユーザーの場合も、パスワードの入力を省略することができるようになります。ID トークンは Google Sign-In でもパスワードの代わりに使用され、そのメールアドレスの所有者であることを示す Google からの証明になります。ユーザーがサイトからメールによってパスワードを再発行した場合、Google の発行した ID トークンは、ユーザーがメールアドレスを所有しており、そのメールアドレスを使用してこの端末にログインしたことを同様に証明します。また、パスワードに加えて ID トークンがあることは、パスワードのクラッキングや不正使用を防ぐ措置であると考えることもできます。

Android ユーザーの大部分は、端末にログインするときに使用するメールアドレスを、サードパーティ アプリのアカウントとしても使用しています。そのため、再訪したユーザーがシームレスにログインしたり、1 回のタップで新規アカウントを作成したりすることができます。

コードサンプルとユーザーフロー

アプリのログイン フローを効率化する方法の概要を次に示します。


アプリが起動すると Smart Lock に保存された認証情報がリクエストされ、可能な場合にはユーザーのコンテンツへ直接移動します。パスワードまたは Google の認証情報のリクエストを作成し、結果のコールバックを待機します。保存されたユーザーの認証情報(ユーザー名/パスワード、ID トークンなど)が利用できる場合、即座にログインします。

 CredentialRequest request = new CredentialRequest.Builder()  
     .setSupportsPasswordLogin(true)  
     .setAccountTypes(IdentityProviders.GOOGLE) // you can add other identity providers, too  
     .build();  
 Auth.CredentialsApi.request(mCredentialsApiClient, request).setResultCallback(  
     new ResultCallback<CredentialRequestResult>() {  
       public void onResult(CredentialRequestResult result) {  
         if (result.getStatus().isSuccess()) {  
          handleCredential(result.getCredential()) // sign in automatically!  

ユーザーがメールアドレスを使用してログインする必要がある場合、メールアドレスの入力を支援するピッカーが表示されます。ヒントのリクエストを作成し、システムにコントロールを渡して UI を表示し、ユーザーがエントリを選択したら結果を処理します。

 HintRequest hintRequest = new HintRequest.Builder()  
     .setEmailAddressIdentifierSupported(true)  
     .setAccountTypes(IdentityProviders.GOOGLE)  
     .build();  
 PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(mCredentialsApiClient,   
                                 hintRequest);  
 startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);  
 ...  
 onActivityResult(int requestCode, int resultCode, Intent data) {  
   switch (requestCode) {  
     case RC_HINT:  
       if (resultCode == RESULT_OK) {  
         Credential hint = data.getParcelableExtra(Credential.EXTRA_KEY);  
         handleCredential(hint);  

ヒントのリクエスト結果が端末上の Google アカウントである場合、その結果にはユーザーが選択した識別子と ID トークンが含まれます。ID トークンを使用する場合、セキュリティ上、サーバーで ID トークンの検証を行う必要があります。このトークンにはメールアドレスの存在が確認されたかの情報が含まれるため、メール検証のステップを省略できることに注意してください。トークンがない、またはサーバー側で検証できない場合は、ユーザーのメール フィールドが事前入力されます。

 handleCredential(Credential credential) {  
   if (!credential.getIdTokens().isEmpty()) {  
     credential.getIdTokens().get(0).getIdToken(); // send the ID token string to your server  
   } else {  
     // otherwise, try fill the sign-in form fields and submit if password is available  
     mEmailField.setText(credential.getId());  
     mPasswordField.setText(credential.getPassword());  

サーバーで ID トークンが正当であることが証明した後、アカウントを作成、もしくはユーザーをパスワードなしログインさせます。Google はトークンの検証を行うためのライブラリを提供しています。また、オープンソースの実装を使用することもできます。ID トークンにはユーザーのメールアドレスが含まれるため、データベースでそのメールアドレスを検索して、アカウントを作成する必要があるかどうかを決めます。

 GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)  
         .setIssuer("https://accounts.google.com")  
         .setAudience(Arrays.asList(String.format("android://%s@%s",   
                             SHA512_HASH, PACKAGE_NAME)))  
         .build();  
 ...  
     GoogleIdToken idToken = verifier.verify(idTokenString);  
     if (idToken == null) {  
       Log.w(TAG, "ID Token Verification Failed, check the README for instructions.");  
       return;  
     }  
     GoogleIdToken.Payload payload = idToken.getPayload();  
     Log.d(TAG, "IdToken:Email:" + payload.getEmail());  
     Log.d(TAG, "IdToken:EmailVerified:" + payload.getEmailVerified());  
     // based on the email address, determine whether you need to create account   
     // or just sign user in  

その後、次回の自動ログインのため、ユーザーのメールアドレス認証情報の「ヒント」を Smart Lock に保存します。ヒントを使って認証情報 API の save メソッドを呼び出し、ユーザーが入力したパスワード、もしくは ID トークンを使ってユーザーをログインさせた場合はアカウント タイプ、を保存します。

 Credential credential = new Credential.Builder(hint)  
     // if you signed in with ID token,   
     // set account type to the URL for your app (instead of a password field)  
     //.setAccountType("https://yourdomain.com")   
     .setPassword(password)  
     .build();  
 Auth.CredentialsApi.save(mCredentialsApiClient, credential).setResultCallback(  
     new ResolvingResultCallbacks<Status>(this, RC_SAVE) {  

詳細を見る

Smart Lock API の実装方法については、コードラボにあるステップ バイ ステップのガイドを参照してください。Smart Lock を使用すると、パスワードなしでの認証が可能になります。認証情報がより効率的に管理できるだけでなく、ユーザー名やパスワードを入力する必要なく、ユーザーがアプリへさらに迅速かつ安全にログインできるようになる世界が到来することを楽しみにしています。皆さんからのフィードバックご質問をお待ちしています。

Posted by Eiji Kitamura - Developer Relations Team