きめ細かい権限を処理する方法

概要

きめ細かい権限を使用すると、ユーザーは各アプリと共有するアカウント データをよりきめ細かく管理できます。きめ細かい権限は、より優れた管理、透明性、セキュリティを実現することで、ユーザーとデベロッパーの両方にメリットをもたらします。このガイドは、Google Cloud で アプリケーションを適切に更新して、きめ細かな権限を処理するための変更と手順を説明します。

きめ細かい権限とは

メールとカレンダーの両方のスコープをリクエストする生産性向上アプリを開発するとします。ユーザー アプリケーションを Google カレンダーでのみ使用し、Gmail には使用しない場合があります。きめ細かい OAuth 権限を使用すると、Google カレンダーの権限のみを付与し、Gmail の権限は付与しないように選択できます。ユーザーが特定のデータへのアクセスを許可できるようにすることで、データの漏洩を最小限に抑え、信頼を強化し、ユーザーがプライバシーを重視したデジタル ライフを管理できるようにします。重要なのは このようなシナリオに対処できるようにアプリケーションを設計します。

ログイン以外のスコープが複数リクエストされた場合

ログイン スコープとログイン以外のスコープ

ログイン スコープと非ログイン スコープの両方をリクエストするアプリケーションの場合、ユーザーは最初に同意を確認する ログイン スコープのページ (emailprofileopenid)。ユーザーが以下に同意した後 基本的な ID 情報(名前、メールアドレス、プロフィール写真)を共有すると、 ログイン以外のスコープに対する詳細な権限同意画面。この例では、アプリケーションは ユーザーによってどのスコープが付与されているかをチェックする必要があり、リクエストされたすべてのスコープをユーザーが あります。次の例では、ウェブ アプリケーションが 3 つのログイン スコープをすべてリクエストし、 Google ドライブのログイン以外のスコープ。ユーザーがログイン スコープに同意すると、 Google ドライブの権限に関する詳細な同意画面:

ログイン スコープとログイン以外のスコープ

ログイン以外のスコープが複数ある

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

ログイン以外のスコープが複数ある

ログインのみを スコープemailprofileopenid)を指定し、 権限同意画面は適用されません。ユーザーはログイン全体を承認または拒否する リクエストできます。つまり、アプリケーションがログイン スコープ(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
});

発信ネットワーク通話を検査する

ネットワーク呼び出しを調べる方法は、 クライアントタイプ。

ネットワーク呼び出しを検査する際に、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

権限をきめ細かく処理するためのベスト プラクティス

アプリケーションを 同意を適切に処理できるようにコードに必要な変更を加えて 使用できます。すべてのアプリケーションは、次のベスト プラクティスに準拠している必要があります。

  1. Google API サービス: ユーザーデータ ポリシー確認し、ポリシーに準拠していることを確認します。
  2. タスクに必要な特定のスコープをリクエストします。マイページ 準拠する必要がある Google OAuth 2.0 ポリシーに準拠する必要があります。 使用するスコープのみをリクエストし、 できます。アプリのコア機能に不可欠な場合を除き、ログイン時に複数のスコープをリクエストしないでください。複数のスコープをまとめると、特にアプリの機能に不慣れな初回ユーザーは、これらの権限の必要性を理解するのが難しくなる可能性があります。これにより、アラームが鳴り、ユーザーがアプリの使用を中止する可能性があります。
  3. 質問する前に、その理由をユーザーに提示します。 認可リクエストだけです。リクエストされた権限がアプリに必要な理由、ユーザーのデータの用途、リクエストを承認することでユーザーにどのようなメリットがあるのか、を明確に説明します。Google の調査では、こうした要因によってユーザーの信頼とエンゲージメントが高まることがわかっています。
  4. アプリがスコープをリクエストするたびに増分認可使用し、複数のアクセス トークンを管理する必要がないようにします。
  5. ユーザーに付与されているスコープを確認します。複数のリクエストに対して ユーザーがリクエストしたすべてのスコープを付与できるとは限りません。アプリは ユーザーによって付与されたスコープを確認し、関連する 説明します。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"]
  }
}

不適切な方法

オール オア ゼロ

ユーザーがボタンをクリックして承認プロセスを開始します。このコード スニペットは、manifest.json ファイルで指定された 2 つのスコープについて、ユーザーに「すべてまたはなし」の同意画面が表示されることを前提としています。ユーザーが付与したスコープを確認する必要はありません。

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 については、 アプリの要件に応じて、権限をきめ細かく ベスト プラクティスをご覧ください。

Google ログイン(iOS および macOS)ライブラリを使用して Google OAuth 2.0 を操作する場合は、詳細な権限の処理に関するドキュメントを確認する必要があります。

ウェブ アプリケーション

Google OAuth 2.0 およびクライアントとのやり取りに使用する SDK については、 アプリの要件に応じて、権限をきめ細かく ベスト プラクティスをご覧ください。

サーバーサイド(オフライン)アクセス

サーバーサイド(オフライン)アクセス モードでは、次の操作が必要です。

次のコード スニペットは、2 つのログイン以外のスコープをリクエストする NodeJS の例を示しています。ユーザーは次の動作をする 詳細な権限同意画面が表示されます。

不適切な方法

オール オア ゼロ

ユーザーは認証 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 を使用して直接呼び出しを行うアプリケーションの場合 確認する必要があります。 ドキュメント 詳しく見ていきましょう。

更新したアプリで詳細な権限の処理をテストする

  1. 概要ユーザーが権限のリクエストに対応できるすべてのケースと、 動作を確認するのに役立ちます。たとえば、ユーザーが 2 つのサブネットのみを 含まれている場合、アプリはそれに応じて動作する必要があります。
  2. 詳細な権限を有効にしてアプリをテストします。有効にするには 2 つの方法があります 詳細な権限を提供します。
    1. アプリケーションの OAuth 2.0 同意画面で、 きめ細かい権限が 説明します。ウェブ、Android、または iOS の新しい Google OAuth 2.0 クライアント ID を作成することもできます。 詳細な権限が常に付与されるため、テスト目的で Google Cloud コンソールから 有効にします。
    2. パラメータを設定する Google OAuth を呼び出すときに enable_granular_consenttrue に設定 <ph type="x-smartling-placeholder"></ph> 認可エンドポイント。一部の SDK はこれを明示的にサポートしています。 パラメータを指定します。その他の場合は、このパラメータを追加する方法と、 値を手動で取得します。 実装でパラメータの追加がサポートされていない場合は、新しいウェブ Android または iOS の Google OAuth 2.0 クライアント ID(Google Cloud コンソールからテストする場合) 使用目的にのみ使用されます。
  3. 更新したアプリケーションをテストするときは、 作成する必要があります。これは、ドメイン全体の権限の委任が付与されているか、信頼できるとマークされている Workspace Enterprise アプリは、現時点ではきめ細かい権限の変更の影響を受けないためです。そのため Workspace を使用したテストでは、 新しい詳細な同意画面が意図したとおりに表示されないことがあります。