概要
きめ細かいアクセス許可により、コンシューマはどのアカウント データをよりきめ細かく制御できるか 各アプリとの 共有を選択できますユーザーとデベロッパーの双方にメリットをもたらす コントロール、透明性、セキュリティです。このガイドは、Google Cloud で アプリケーションを適切に更新して、きめ細かな権限を処理するための変更と手順を説明します。
きめ細かい権限とは
メールとカレンダーの両方のスコープをリクエストする生産性向上アプリを開発するとします。ユーザー アプリケーションを Google カレンダーでのみ使用し、Gmail には使用しない場合があります。きめ細かい OAuth Google カレンダーのみを許可し、Gmail には許可しないように選択することができます。 ユーザーが特定のデータへのアクセスを許可できるようにすることで、データ漏洩を最小限に抑え、 デジタルライフをプライバシー最優先で管理できるようユーザーを支援します。重要なのは このようなシナリオに対処できるようにアプリケーションを設計します。
ログイン以外のスコープが複数リクエストされた場合
ログイン スコープとログイン以外のスコープ
ログイン スコープと非ログイン スコープの両方をリクエストするアプリケーションの場合、ユーザーは最初に同意を確認する
ログイン スコープのページ
(email
、profile
、openid
)。ユーザーが以下に同意した後
基本的な ID 情報(名前、メールアドレス、プロフィール写真)を共有すると、
ログイン以外のスコープに対する詳細な権限同意画面。この例では、アプリケーションは
ユーザーによってどのスコープが付与されているかをチェックする必要があり、リクエストされたすべてのスコープをユーザーが
あります。次の例では、ウェブ アプリケーションが 3 つのログイン スコープをすべてリクエストし、
Google ドライブのログイン以外のスコープ。ユーザーがログイン スコープに同意すると、
Google ドライブの権限に関する詳細な同意画面:

ログイン以外のスコープが複数ある
アプリが追加をリクエストした場合、詳細な権限同意画面がユーザーに表示される スコープには複数のスコープがありますユーザーは共有を承認する権限を選択できます 必要があります。きめ細かい権限同意画面の例を以下に示します。 ユーザーの Gmail メッセージと Google カレンダーのデータには、次の方法でアクセスできます。

ログインのみを
スコープ(email
、profile
、openid
)を指定し、
権限同意画面は適用されません。ユーザーはログイン全体を承認または拒否する
リクエストできます。つまり、アプリケーションがログイン スコープ(1 つ、2 つ、またはすべての
3)に設定すると、詳細な権限同意画面は利用できません。
ログイン以外のスコープを 1 つのみリクエストするアプリケーションの場合、 権限同意画面は適用されません。言い換えれば、ユーザーは承認するか、 リクエスト全体が拒否され、同意画面にチェックボックスが表示されません。次の表に によって、詳細な権限同意画面が表示されるときに要約されます。
ログイン スコープの数 | ログイン以外のスコープの数 | きめ細かい権限同意画面 |
---|---|---|
1~3 | 0 | 該当なし |
1~3 | 1+ | 該当 |
0 | 1 | 該当なし |
0 | 2+ | 該当 |
アプリケーションが影響を受けるかどうかを判断する
権限リクエストに Google OAuth 2.0 認可エンドポイントが使用されているアプリケーション内のすべてのセクションを徹底的に確認します。注意すべき点は きめ細かい権限同意画面が有効になり、複数のスコープをリクエストする場合 説明します。そのようなケースでは、ユーザーがアクセスできないケースにコードで対応できるようにし、 いくつかのスコープを承認します。
アプリケーションが複数のスコープを使用しているかどうかを判断する方法
アプリコードを検査するか、 送信ネットワーク通話に基づいて、Google OAuth 2.0 アプリが行う承認リクエストによって、詳細な権限同意画面が表示される 表示されます。
アプリケーション コードを検査する
アプリケーション コードで Google OAuth を呼び出すセクションを確認する 認可エンドポイントを使用して、ユーザーに権限をリクエストします。いずれかの Google API を使用している場合 クライアント ライブラリで、アプリケーションがリクエストするスコープを 初期化ステップを実行します。次のセクションで例を示します。詳しくは、 Google OAuth 2.0 の処理に使用する SDK に関するドキュメントを確認して、 アプリケーションの影響を受ける可能性があるため、 ご覧ください。
Google Identity Services
次の Google Identity Services
JavaScript ライブラリのコード スニペットは、TokenClient
を複数の
制限します。きめ細かい権限同意画面は、ウェブ アプリが
アプリがユーザーに認証を要求します。
const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly \ https://www.googleapis.com/auth/contacts.readonly', callback: (response) => { ... }, });
Python
次のコード スニペットでは、google-auth-oauthlib.flow
モジュールを使用して以下を行います。
認可リクエストを作成します。scope
パラメータには次の 2 つが含まれます。
制限します。きめ細かい権限同意画面は、ウェブ アプリが
ユーザーに承認を要求します。
import google.oauth2.credentials import google_auth_oauthlib.flow # Use the client_secret.json file to identify the application requesting # authorization. The client ID (from that file) and access scopes are required. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/calendar.readonly', 'https://www.googleapis.com/auth/contacts.readonly'])
Node.js
次のコード スニペットは、google.auth.OAuth2
オブジェクトを作成します。このオブジェクトは、
承認リクエストの scope
パラメータに 2 つのパラメータが含まれている
制限します。この詳細な権限同意画面は、ウェブアプリで
ユーザーに承認をリクエストします。
const {google} = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI * from the client_secret.json file. To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Calendar and Contacts. const scopes = [ 'https://www.googleapis.com/auth/calendar.readonly', 'https://www.googleapis.com/auth/contacts.readonly'] ]; // Generate a url that asks permissions const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true });
発信ネットワーク通話を検査する
- ウェブ アプリケーション - <ph type="x-smartling-placeholder"></ph> Chrome のネットワーク アクティビティを調べる
- Android - ネットワーク インスペクタでネットワーク トラフィックを検査する
-
Chrome アプリ
<ph type="x-smartling-placeholder">
- </ph>
- [ Chrome 拡張機能 ページ
- 右上の [デベロッパー モード] チェックボックスをオンにします。 拡張機能ページの隅
- モニタリングする拡張機能を選択する
- [バックグラウンド ページ] のリンクをクリックします。 拡張機能ページの [Inspect views] セクション
- デベロッパー ツールのポップアップが開き、 ネットワーク トラフィックをモニタリングして、 <ph type="x-smartling-placeholder"></ph> [Network] タブ
- iOS - <ph type="x-smartling-placeholder"></ph> Instruments による HTTP トラフィックの分析
- ユニバーサル Windows プラットフォーム(UWP) - <ph type="x-smartling-placeholder"></ph> Visual Studio でネットワーク トラフィックを検査する
- デスクトップ アプリ - <ph type="x-smartling-placeholder"></ph> ネットワーク キャプチャ ツールを使用する アプリが開発されたオペレーティング システムで利用可能
ネットワーク呼び出しを調べる際に、Google OAuth に送信されたリクエストを探します。
認可エンドポイントを調べて、scope
パラメータを調べます。
これらの値により、詳細な権限同意画面が表示されます。
scope
パラメータには、ログイン スコープと非ログイン スコープが含まれています。次のサンプル リクエストには、3 つのログイン スコープと 1 つの非ログイン スコープがすべて含まれています ユーザーの Google ドライブ ファイルのメタデータを表示するには:
https://accounts.google.com/o/oauth2/v2/auth? access_type=offline& scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly& include_granted_scopes=true& response_type=code& redirect_uri=YOUR_REDIRECT_URL& client_id=YOUR_CLIENT_ID
scope
パラメータに、ログイン以外のスコープが複数含まれています。次のサンプル リクエストには、ユーザーの Google ドライブを表示するためのログイン以外のスコープが 2 つ含まれています。 特定の Google ドライブ ファイルを管理できます。
https://accounts.google.com/o/oauth2/v2/auth? access_type=offline& scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file& include_granted_scopes=true& response_type=code& redirect_uri=YOUR_REDIRECT_URL& client_id=YOUR_CLIENT_ID
権限をきめ細かく処理するためのベスト プラクティス
アプリケーションを、 同意を適切に処理できるようにコードに必要な変更を加えて 使用できます。すべてのアプリケーションは、次のベスト プラクティスに準拠している必要があります。
- を確認 Google API サービス: ユーザーデータに関するポリシーを参照し、ポリシーに準拠するようにしてください。
- タスクに必要な特定のスコープをリクエストします。マイページ 準拠する必要がある Google OAuth 2.0 ポリシーに準拠する必要があります。 使用するスコープのみをリクエストし、 できます。1 対 1 やグループの会話を複数 スコープはログイン時に制限されません。ただし、アプリのコア機能に不可欠な場合を除きます。分類 理解しやすく、API 構成に馴染みのない初めてのユーザーにとっては、 機能によって、こうした機能が必要であることをユーザーが理解することが 付与できます。その結果、アラームが鳴り、ユーザーが 説明します。
- 質問する前に、その理由をユーザーに提示します。 認可リクエストだけです。アプリがリクエストした権限を必要とする理由を明確に説明する。 ユーザーのデータをどのように処理するか、リクエストを承認することでユーザーがどのようなメリットを得られるかを定義します。 Google の調査では、こうした要因によってユーザーの信頼とエンゲージメントが高まることがわかっています。
- 用途 段階的な承認 スコープをリクエストするたびに、複数のアクセス トークンを管理する必要がなくなります。
- ユーザーに付与されているスコープを確認します。複数のリクエストに対して ユーザーがリクエストしたすべてのスコープを付与できるとは限りません。アプリは ユーザーによって付与されたスコープを確認し、関連する 説明します。Google OAuth 2.0 ポリシーに準拠してください 複数の スコープを設定し、ユーザーが明確に示している場合にのみ、ユーザーに再度同意を求めるようにします スコープを必要とする特定の機能を使用するインテント。
アプリをアップデートして権限を詳細に管理
Android アプリ
Google OAuth 2.0 およびクライアントとのやり取りに使用する SDK については、 アプリの要件に応じて、権限をきめ細かく ベスト プラクティスをご覧ください。
以下をご使用の場合:
auth.api.signin
SDK を使用して Google OAuth 2.0 を操作するには、
requestPermissions
必要な最小のスコープセットをリクエストする
および
hasPermissions
ユーザーが付与したスコープをcheck
きめ細かくアクセスできるようになります。
Chrome 拡張機能アプリケーション
使用すべき Google Chrome Identity API を使って Google OAuth 2.0 と連携し、 ベスト プラクティスをご覧ください。
次の例は、細分化された権限を適切に処理する方法を示しています。
manifest.json
サンプルのマニフェスト ファイルでは、Chrome 拡張機能に対して 2 つのログイン以外のスコープを宣言しています 説明します。
{ "name": "Example Chrome extension application", ... "permissions": [ "identity" ], "oauth2" : { "client_id": "YOUR_CLIENT_ID", "scopes":["https://www.googleapis.com/auth/calendar.readonly", "https://www.googleapis.com/auth/contacts.readonly"] } }
不適切な方法
オール オア ゼロ
ユーザーがボタンをクリックして承認プロセスを開始します。コード スニペットは、
ユーザーは「オール オア ナッシング」の指定された 2 つのスコープの同意画面
(manifest.json
ファイル内)。ユーザーが付与したスコープを確認する必要はありません。
oauth.js
... document.querySelector('button').addEventListener('click', function () { chrome.identity.getAuthToken({ interactive: true }, function (token) { if (token === undefined) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // User authorized both or one of the scopes. // It neglects to check which scopes users granted and assumes users granted all scopes. // Calling the APIs, etc. ... } }); });
適切なアプローチ
最小スコープ
必要最小限のスコープのセットを選択する
アプリケーションは、必要最小限のスコープのセットのみをリクエストする必要があります。おすすめの方法 スコープを 1 つずつリクエストすることをおすすめします。
この例では、manifest.json
で両方のスコープが宣言されていることを前提としています。
必要な最小のスコープセットです。oauth.js
ファイルは Chrome を使用します
Identity API を使用して Google との認証プロセスを開始します。オプトインすると
権限の付与をユーザーがより細かく管理できるようにすることで、権限の付与をより細かく制御できるようになります。
説明します。アプリケーションで、ユーザーからのレスポンスを適切に処理するには、
ユーザーが承認するスコープを指定します。
oauth.js
... document.querySelector('button').addEventListener('click', function () { chrome.identity.getAuthToken({ interactive: true, enableGranularPermissions: true }, function (token, grantedScopes) { if (token === undefined) { // User didn't authorize any scope. // Updating the UX and application accordingly ... } else { // User authorized the request. Now, check which scopes were granted. if (grantedScopes.includes('https://www.googleapis.com/auth/calendar.readonly')) { // User authorized Calendar read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Calendar read permission. // Update UX and application accordingly ... } if (grantedScopes.includes('https://www.googleapis.com/auth/contacts.readonly')) { // User authorized Contacts read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Contacts read permission. // Update UX and application accordingly ... } } }); });
iOS、iPadOS、macOS アプリケーション
Google OAuth 2.0 およびクライアントとのやり取りに使用する SDK については、 アプリの要件に応じて、権限をきめ細かく ベスト プラクティスをご覧ください。
iOS および macOS 用の Google ログイン ライブラリを使用している場合 Google OAuth 2.0 を操作するには、 細かな粒度の処理に関するドキュメント 付与できます。
ウェブ アプリケーション
Google OAuth 2.0 およびクライアントとのやり取りに使用する SDK については、 アプリの要件に応じて、権限をきめ細かく ベスト プラクティスをご覧ください。
サーバーサイド(オフライン)アクセス
- サーバーを立ち上げ、認証コードを受信する一般公開エンドポイントを定義します。
- 構成する リダイレクト URI です。 。
次のコード スニペットは、NodeJS で 2 つの非ログイン スコープをリクエストする例を示しています。ユーザーは次の動作をする 詳細な権限同意画面が表示されます。
不適切な方法
オール オア ゼロ
ユーザーは認証 URL にリダイレクトされます。このコード スニペットでは、ユーザーが
「オール オア ナッシング」スコープで指定された 2 つの同意画面
scopes
の到着地。ユーザーが付与したスコープを確認していない。
main.js
... const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for two non-Sign-In scopes - Google Calendar and Contacts const scopes = [ 'https://www.googleapis.com/auth/contacts.readonly', 'https://www.googleapis.com/auth/calendar.readonly' ]; // Generate a url that asks permissions for the Google Calendar and Contacts scopes const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', // Pass in the scopes array defined above scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true }); async function main() { const server = http.createServer(async function (req, res) { // Example on redirecting user to Google OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the Google OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // User authorized both or one of the scopes. // It neglects to check which scopes users granted and assumes users granted all scopes. // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); // Calling the APIs, etc. ... } } res.end(); }).listen(80); }
適切なアプローチ
最小スコープ
必要最小限のスコープのセットを選択する
アプリケーションは、必要最小限のスコープのセットのみをリクエストする必要があります。おすすめの方法 スコープを 1 つずつリクエストすることをおすすめします。 アプリケーションでスコープをリクエストするたびに、 段階的承認 複数のアクセス トークンを管理する必要がなくなります。
アプリケーションがログイン以外のスコープを複数リクエストする必要がある場合は、常に 段階的承認 ユーザーが付与したスコープを確認します。
この例では、アプリで上記の両方のスコープが必要であり、 確認します。オプトインすると 権限の付与をユーザーがより細かく管理できるようにすることで、権限の付与をより細かく制御できるようになります。 説明します。アプリケーションで、ユーザーからのレスポンスを適切に処理するには、 スコープが表示されます。
main.js
... const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for two non-Sign-In scopes - Google Calendar and Contacts const scopes = [ 'https://www.googleapis.com/auth/contacts.readonly', 'https://www.googleapis.com/auth/calendar.readonly' ]; // Generate a url that asks permissions for the Google Calendar and Contacts scopes const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', // Pass in the scopes array defined above scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true, // Set to true to enable more granular permissions for Google OAuth 2.0 client IDs created before 2019. // No effect for newer Google OAuth 2.0 client IDs, since more granular permissions is always enabled for them. enable_granular_consent: true }); async function main() { const server = http.createServer(async function (req, res) { // Redirect users to Google OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the Google OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // User authorized the request. Now, check which scopes were granted. if (tokens.scope.includes('https://www.googleapis.com/auth/calendar.readonly')) { // User authorized Calendar read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Calendar read permission. // Calling the APIs, etc. ... } // Check which scopes user granted the permission to application if (tokens.scope.includes('https://www.googleapis.com/auth/contacts.readonly')) { // User authorized Contacts read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Contacts read permission. // Update UX and application accordingly ... } } } res.end(); }).listen(80); }
詳しくは、 サーバーサイド ウェブアプリ ガイドをご覧ください。
クライアントサイドのみのアクセス
- Google Identity Services を使用するアプリケーション JavaScript ライブラリを使用して Google OAuth 2.0 とやり取りする方法を ドキュメント 詳しく見ていきましょう。
- Google OAuth 2.0 認証に対して JavaScript を使用して直接呼び出しを行うアプリケーションの場合 確認する必要があります。 ドキュメント 詳しく見ていきましょう。
更新したアプリで詳細な権限の処理をテストする
- 概要ユーザーが権限のリクエストに対応できるすべてのケースと、 動作を確認するのに役立ちます。たとえば、ユーザーが 2 つのサブネットのみを 含まれている場合、アプリはそれに応じて動作する必要があります。
-
詳細な権限を有効にしてアプリをテストします。有効にするには 2 つの方法があります
詳細な権限を提供します。
- アプリケーションの OAuth 2.0 同意画面で、 きめ細かい権限が 説明します。ウェブ、Android、または iOS の新しい Google OAuth 2.0 クライアント ID を作成することもできます。 詳細な権限が常に付与されるため、テスト目的で Google Cloud コンソールから 有効にします。
-
パラメータを設定する
Google OAuth を呼び出すときに
enable_granular_consent
をtrue
に設定 <ph type="x-smartling-placeholder"></ph> 認可エンドポイント。一部の SDK はこれを明示的にサポートしています。 パラメータを指定します。その他の場合は、このパラメータを追加する方法と、 値を手動で取得します。 実装でパラメータの追加がサポートされていない場合は、新しいウェブ Android または iOS の Google OAuth 2.0 クライアント ID(Google Cloud コンソールからテストする場合) 使用目的にのみ使用されます。
- 更新したアプリケーションをテストするときは、 作成する必要があります。これは、Workspace Enterprise アプリが ドメイン全体の権限の委任、または 信頼できる 現在のところ、きめ細かい権限の変更による影響はありません。そのため Workspace を使用したテストでは、 新しい詳細な同意画面が意図したとおりに表示されないことがあります。