概要
2022 年 2 月 16 日に、より安全な OAuth フローを使用して Google OAuth の操作をより安全にする計画を 発表しました。このガイドでは、ループバック IP アドレスのフローからサポートされている代替アドレスフローに正常に移行するために必要な変更と手順について説明します。
この取り組みは、Google の OAuth 2.0 認可エンドポイントとのやり取り中のフィッシング攻撃やアプリのなりすまし攻撃から保護するための対策です。
ループバック IP アドレスのフローとは
ループバック IP アドレスのフローでは、ユーザーが OAuth 同意リクエストを承認した後に認証情報が送信されるリダイレクト URI のホスト コンポーネントとして、ループバック IP アドレスまたはlocalhost
を使用できます。このフローは中間者攻撃に対して脆弱です。この攻撃では、一部のオペレーティング システムで同じループバック インターフェースにアクセスする悪意のあるアプリが、認可サーバーから指定されたリダイレクト URI へのレスポンスを傍受して、認可コードにアクセスするおそれがあります。ループバック IP アドレスフローは、iOS、Android、Chrome の OAuth クライアント タイプのネイティブでのサポートが終了しますが、デスクトップ アプリでは引き続きサポートされます。
主なコンプライアンス期間
- 2022 年 3 月 14 日 - 新しい OAuth クライアントのループバック IP アドレス フローの使用をブロック
- 2022 年 8 月 1 日 - ポリシーに準拠していない OAuth リクエストに対して、ユーザー向けの警告メッセージが表示される場合がある
- 2022 年 8 月 31 日 - 2022 年 3 月 14 日より前に作成されたネイティブ Android、Chrome アプリ、iOS OAuth クライアントに対するループバック IP アドレスのフローのブロック
- 2022 年 10 月 21 日 - 既存のすべてのクライアントをブロックします(除外されたクライアントを含む)
準拠していないリクエストについては、ユーザー向けのエラー メッセージが表示されます。このメッセージは、アプリがブロックされていることをユーザーに伝えると同時に、Google API Console の OAuth 同意画面で登録したサポートメールを表示します。
- ご自身に影響があるかどうかを判断します。
- 影響を受ける場合は、サポートされている代替手段に移行してください。
影響を受けるかどうかを判断する
OAuth クライアント ID のタイプを確認する
Google API Console の Credentials page に移動し、[OAuth 2.0 クライアント ID] セクションで OAuth クライアント ID の種類を表示します。次のいずれかになります: ウェブ アプリケーション、Android、iOS、Universal Windows Platform(UWP)、Chrome アプリ、テレビと入力制限のあるデバイス、デスクトップ アプリ。
クライアントの種類が Android、Chrome アプリ、iOS のいずれかで、ループバック IP アドレス フローを使用している場合は、次のステップに進みます。
デスクトップ アプリの OAuth クライアントでループバック IP アドレスフローを使用している場合は、この OAuth クライアント タイプでの使用が引き続きサポートされるため、このサポート終了に関連して何もする必要はありません。
アプリがループバック IP アドレス フローを使用しているかどうかを確認する方法
アプリコードまたは送信ネットワーク呼び出し(アプリが OAuth ライブラリを使用している場合)を検査して、アプリが行う Google OAuth 認証リクエストがループバック リダイレクト URI 値を使用しているかどうかを確認します。
アプリケーション コードを検査する
redirect_uri
パラメータが次のいずれかの値になっているか確認します。-
redirect_uri=http://127.0.0.1:<port>
(例:redirect_uri=http://127.0.0.1:3000
) -
redirect_uri=http://[::1]:<port>
(例:redirect_uri=http://[::1]:3000
) -
redirect_uri=http://localhost:<port>
(例:redirect_uri=http://localhost:3000
)
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
発信ネットワーク呼び出しの検査
- ウェブ アプリケーション - Chrome でのネットワーク アクティビティを調査
- Android - Network Inspector を使用してネットワーク トラフィックを検査する
-
Chrome アプリ
- Chrome 拡張機能のページに移動します。
- 拡張機能ページの右上にある [デベロッパー モード] チェックボックスをオンにします。
- モニタリングする拡張機能を選択する
- 拡張機能ページの [Inspect view] セクションにある [バックグラウンド ページ] リンクをクリックします。
- デベロッパー ツールのポップアップが開き、 [Network] タブでネットワーク トラフィックをモニタリングできます。
- iOS - Instruments を使用した HTTP トラフィックの分析
- Universal Windows Platform(UWP) - Visual Studio でネットワーク トラフィックを検査する
- デスクトップ アプリ - 開発対象のオペレーティング システムで利用可能な ネットワーク キャプチャ ツールを使用する
redirect_uri
パラメータが次のいずれかの値となっているかどうかを確認します。
-
redirect_uri=http://127.0.0.1:<port>
(例:redirect_uri=http://127.0.0.1:3000
) -
redirect_uri=http://[::1]:<port>
(例:redirect_uri=http://[::1]:3000
) -
redirect_uri=http://localhost:<port>
(例:redirect_uri=http://localhost:3000
)
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
サポートされている代替サービスに移行する
モバイル クライアント(Android / iOS)
Android または iOS の OAuth クライアント タイプでループバック IP アドレスのフローを使用していることが判明した場合は、Google ログイン モバイル SDK(Android、iOS)を使用するように移行する必要があります。
この SDK により、Google API に簡単にアクセスでき、Google の OAuth 2.0 認可エンドポイントへのすべての呼び出しが処理されます。
以下のドキュメント リンクでは、Google ログイン SDK を使用して、ループバック IP アドレスのリダイレクト URI を使用せずに Google API にアクセスする方法について説明します。
Android で Google API にアクセスする
サーバーサイド(オフライン)アクセス
次の例は、Android のサーバー側から Google API にアクセスする方法を示しています。Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // request a one-time authorization code that your server exchanges for an // access token and sometimes refresh token String authCode = account.getServerAuthCode(); // Show signed-in UI updateUI(account); // TODO(developer): send code to server and exchange for access/refresh/ID tokens } catch (ApiException e) { Log.w(TAG, "Sign-in failed", e); updateUI(null); }
サーバー側から Google API にアクセスする方法については、サーバー側のアクセスガイドをご覧ください。
iOS アプリで Google API にアクセスする
クライアントサイド アクセス
次の例は、iOS のクライアント側で Google API にアクセスする方法を示しています。
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
アクセス トークンを使用して API を呼び出すには、アクセス トークンを REST または gRPC リクエストのヘッダーに含めるか(Authorization: Bearer ACCESS_TOKEN
)、フェッチャー承認ツール(GTMFetcherAuthorizationProtocol
)と
Objective-C for REST 用 Google API クライアント ライブラリを使用します。
クライアントサイドで Google API にアクセスする方法については、クライアントサイド アクセスガイドをご覧ください。クライアント側で Google API にアクセスする方法も学びました。
サーバーサイド(オフライン)アクセス
以下の例は、サーバー側で Google API にアクセスして iOS クライアントをサポートする方法を示しています。GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } guard let user = user else { return } // request a one-time authorization code that your server exchanges for // an access token and refresh token let authCode = user.serverAuthCode }
サーバー側から Google API にアクセスする方法については、サーバー側のアクセスガイドをご覧ください。
Chrome アプリ クライアント
アプリが Chrome アプリ クライアントのループバック IP アドレス フローを使用していることが判明した場合は、 Chrome Identity API を使用するよう移行する必要があります。
次の例は、ループバック IP アドレスのリダイレクト URI を使用せずに、すべてのユーザーの連絡先を取得する方法を示しています。
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below shows how to use a retrieved access token with an appropriate scope // to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
Chrome Identity API を使用してユーザー認証にアクセスし、Google エンドポイントを呼び出す方法については、 Chrome Identity API ガイドをご覧ください。