デベロッパーがユーザーの電話番号をリクエストするもう 1 つの方法は、Android デバイスで新しい Phone Number Hint API を使うことです。デベロッパーが Phone Number Hint API を呼び出すと、ユーザーはデバイスの SIM カードの電話番号を共有できます。これは、登録やログインのフローとは関係なく利用できます。この API には追加のパーミッションは不要なので、ネイティブ Android API を呼び出す方法よりもお勧めです。デベロッパーは時間と作業量を減らすことができます。Phone Number Hint API は、ユーザーが Google アカウントにログインしていなくても利用できます。Google アカウントに情報が保存されることもありません。
ウェブ
ITP ブラウザの One Tap
ITP(Intelligent Tracking Prevention)ブラウザでは、サードパーティ Cookie の利用が制限されるので、ウェブでユーザーがトラッキングされることはありません。今回、iOS 版の Safari、Firefox、Chrome などの ITP ブラウザで、GIS One Tap が利用できるようになります。これにより、ユーザーとデベロッパーの両方のために、複数のプラットフォームで一貫したワンタップ操作を実現します。デベロッパーは、次のようなさまざまな理由で One Tap の利用を好んでいます。
ユーザーのコンバージョンの増加
業界をリードするセキュリティ
パスワード管理に伴うリスクの削減
専用のログインページや登録ページにリダイレクトせずにログインや登録を実現
パーソナライズしたプロンプトによる重複アカウントの削減と再訪ユーザーの自動ログイン
ITP ブラウザでの One Tap の UX は、次のようなウェルカム ページから始まります。
ユーザーが続行することを選ぶと、ポップアップ ウィンドウが開きます。ポップアップ ウィンドウの UX は、標準の One Tap ユーザー エクスペリエンスと同じです。
この新機能は、One Tap を有効にしているすべてのデベロッパーを対象に、2022 年 10 月 12 日にデフォルトとしてロールアウトされる予定です。さっそく ITP ブラウザで One Tap のサポートを始めたい方や、デフォルトのサポートをオプトアウトしたい方は、ドキュメントをご覧ください。
iOS と macOS
macOS プラットフォーム拡張
この数年間で Apple のエコシステムは拡大し、多くの異なるプラットフォーム(iOS、iPadOS、macOS、tvOS、watchOS)が含まれるようになりました。そこで、Apple エコシステムのサポート拡大に向けて、iOS と macOS 向け Google ログインの一環として、macOS サポートをリリースします。これにより、ネイティブ macOS アプリで中核的な GIS 操作(認証、認可、トークンの保存)がサポートされるようになります。
サポートの終了
サポートの終了予定
GIS ライブラリで利用できる新機能に加えて、今後のサポートの終了予定についてもお知らせします。
Android での Smart Lock for Passwords のサポート終了
ウェブサイト向け Google ログインのサポート終了
Smart Lock for Passwords のサポート終了
Smart Lock for Passwords Android SDK のサポートが終了します。この機能は、パスワードの保存と取得、ID トークンのリクエスト、ログインヒントの取得をします。GIS ライブラリでは、Smart Lock for Passwords のすべての機能を利用できます。すべてのデベロッパーの皆さんには、新しい機能用に GIS ライブラリを使うことをお勧めします。既存の統合機能の Smart Lock for Passwords トラフィックは、デフォルトで GIS ライブラリにリダイレクトされます。デベロッパーによる変更作業は必要ありません。
SMS User Consent API を使用すると、ユーザーに対して、1 回限りのコードを含んだ 1 通の SMS メッセージの読み取り許可を求めるプロンプトをアプリから表示できます。その後、アプリでメッセージを解析したうえで、SMS による確認のフローを自動的に完了できます。
1 回限りのコードを含んだ 1 通のテキスト メッセージの読み取り許可をユーザーに求めます。
すでに SMS Retriever API を使用している場合、SMS User Consent API によって SMS Retriever API のサポートが終了したり、置き換えられたりすることはありません。SMS Retriever API をサポートするためにアプリがメッセージを変更できない場合もあることから、Google では 2 つ目の API を追加します。
SMS User Consent API を実装する前に SMS Retriever API をチェックして、ご自身のアプリで機能するかどうかを確認してください。使用できる場合、ユーザーがプロンプトをスキップできるため、利便性が向上します。
API の概要
本稿では、この API の使用に慣れるための基礎的な内容を説明します。実装例を含むこの API についての詳細は、ドキュメントをご覧ください。
SMS User Consent API は Google Play 開発者サービスの一部です。使用するには、以下のライブラリのバージョン 17.0.0 以降が必要になります。
「たった半日で認証を実装することができました。以前は、独自のソリューションの作成には何週間もかかり、プロバイダの API に変更が発生するたびにアップデートしなければなりませんでした」- Amine Laadhari, Fabulous CTO
Malang Studio が Firebase Authentication で商品化までの時間を月単位で短縮
Chu-Day(Android と iOS に対応)は、カップルが重要な日を忘れないようにするためのアプリケーションです。このアプリは、キャラクター中心のゲーム型ライフスタイル アプリケーションを開発している韓国企業 Malang Studio が作成しました。
一般的に、カウントダウンや記念日関係のアプリはユーザーのログインを要求しません。Malang Studio は、カップルをつないで特別な記念日をともにカウントダウンできるようにすることで、Chu-day を特別なアプリにして差別化を図りたいと考えました。しかしこれにはログイン機能が必要で、ユーザーの脱落を防ぐシームレスなログイン プロセスも必要でした。
Malang Studio は、Facebook や Google のログインを利用することで、 1 日で初回起動フローをアプリに組み込むことができました。サーバー側の開発やデータベースについて考える必要はなく、Firebase User Management Console を活用し、ログイン実装の開発やテスト、ユーザーの管理を行うこともできました。
「Firebase Authentication は最低限の設定しか必要としないので、短時間で簡単にソーシャル アカウントへのサインアップが実装できました。コンソールで提供されるユーザー管理機能もすばらしく、簡単に認証システムを実装できました」- Marc Yeongho Kim, Malang Studio CEO 兼 創立者
サーバーでドライブなどのその他の Google サービスへのアクセスが必要な場合、サーバー認証コードフローを使用する必要があります。このブログ記事も参考になります。参考までに、サーバー認証コードフローを使用して ID トークンも取得できます。これから、追加のネットワーク呼び出しを行わずに、ユーザー ID / メール / 名前 / プロファイル URL を取得できます。移行ガイドを参照してください。
一般的には、GoogleAuthUtil.getToken を使うべきではありません。ただし、Android クライアントで REST API 呼び出しを行っている場合を除きます。そういった場合は代わりに Auth.GOOGLE_SIGN_IN_API を使用してください。可能な場合は必ず Google Play サービス SDK のネイティブ Android API を使用してください。これらの API は、Android 用 Google API で確認できます。
また、Google Play サービス SDK 9.0 以降では、GoogleAuthUtil.getToken および次の関連クラスを使用するために -auth の SDK の分岐を含める必要があります。
AccountChangeEvent/AccountChangeEventsRequest/AccountChangeEventsResponse dependencies { compile 'com.google.android.gms:play-services-auth:9.0.0' }
ここで、「Web client」のクライアント ID に注目してください。下記の図のとおり、アプリとサーバーの両方の ID が必要です(過去にプロジェクトを作成しており、そのプロジェクトの「Web application」に OAuth 2.0 クライアント ID がない場合は、[New Credentials]、[OAuth client ID] の順に選択して、クライアント ID を新規作成してください)。
バックエンド認証の ID トークン フローを利用する場合は、Android アプリの開発を開始する際に、GoogleSignInOptions にお使いのサーバーのウェブ クライアント ID を指定して ID トークンをリクエストします。
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(serverClientId)
.requestEmail()
.build();
続いてサーバー側で、オーディエンスとなるウェブ アプリケーションに、同じ OAuth クライアント ID を設定します。
GoogleIdTokenVerifier verifier =
new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Arrays.asList(serverClientId))
.setIssuer("https://accounts.google.com")
.build();
これはユーザー エクスペリエンスが悪いというだけではなく、顧客データが盗まれ、悪用されるというリスクの問題でもあります。これを防ぐため、ユーザーがアプリにサインインする際に Google からトークンを取得し、このトークンをサーバーに渡すようにします。サーバーは、このトークンが本当に Google がそのアプリの正規ユーザー宛てに発行したものかどうかを確認します(オーディエンス設定に基づいて実行します。下図参照)。この時点でサーバーは、サインインしようとしているのがこのアプリの正規ユーザーであり、不正な攻撃者ではないことを確認できます。その後、サーバーは要求された詳細情報を返します。
図 2.第三者の偽のトークンを拒否する
このステップを見てみましょう。
ステップ 1: Google にサインインすると、Android アプリは ID トークン(*)を取得します。こちらはこのプロセスの一例です。これを実行するには、GoogleSignInOptions オブジェクトを作成するときに requestIdToken メソッドを呼び出します。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.server_client_id))
.requestEmail()
.build();
これには、サーバーのクライアント ID を取得する必要があります。この方法についての詳細は、こちらをご覧ください(ステップ 4 を参照)。
Android アプリで取得されたトークンは、HTTPS でサーバーに POST できます。次にサーバーはトークンを認証します。
(*)ID トークンは JSON Web Token であり、RFC7519 で定義されています。これは二者間の要求を安全に表現するためのメソッドであり、業界標準として公開されています。
ステップ 2: サーバーは Android クライアントからトークンを受け取ります。次にサーバーは、Google API Client ライブラリで提供されているメソッドを使用してこのトークンを認証します。このトークンが Google によって発行されたものであること、そして対象オーディエンスがこのサーバーであることが認証されます。
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Here is where the audience is set -- checking that it really is your server
// based on your Server’s Client ID
.setAudience(Arrays.asList(ENTER_YOUR_SERVER_CLIENT_ID_HERE))
// Here is where we verify that Google issued the token
.setIssuer("https://accounts.google.com").build();
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
String userId = payload.getSubject();
// You can also access the following properties of the payload in order
// for other attributes of the user. Note that these fields are only
// available if the user has granted the 'profile' and 'email' OAuth
// scopes when requested. Even when requested, some fields may be null.
// String email = payload.getEmail();
// boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
// String name = (String) payload.get("name");
// String pictureUrl = (String) payload.get("picture");
// String locale = (String) payload.get("locale");
// String familyName = (String) payload.get("family_name");
// String givenName = (String) payload.get("given_name");
GoogleAuthUtil を使用してバックエンドに渡すトークンを取得している既存アプリをお持ちの場合、上記のような最新の ID トークン認証を行うライブラリやシステムに切り替える必要があります。サーバー側でのベスト プラクティスを実現するための推奨事項は、今後の記事でご紹介する予定です。
この記事では、認証テクノロジーを使用して、ユーザーの本人認証を行う方法を説明しました。次回の記事では、Google Sign-In API を認証に使用して、ユーザーがアプリやバックエンド サービスから Google ドライブ などの Google サービスへアクセスする方法などを説明する予定です。