エンドユーザーとして認証

ほとんどの状況で、Google Cloud Platform(GCP)API に対する認証用のサービス アカウントを使用することをおすすめします。ある状況においては、ユーザーに直接認証してもらうことが必要な場合があります。次に例を示します。

  • アプリケーションのエンドユーザーに代わってリソースにアクセスする必要がある場合。たとえば、アプリケーションのユーザーに属する Google BigQuery データセットにアプリケーションがアクセスする必要がある場合などです。

  • アプリケーションではなく自分自身で認証する必要がある場合。たとえば、Cloud Resource Manager API では、特定のユーザーが所有するプロジェクトの作成と管理が可能であるため、代わりにプロジェクトを作成するユーザーとして認証する必要があります。

このガイドでは、エンドユーザー認証情報について説明します。アプリケーションへのユーザーの認証については説明しません。そのユースケースについては、Firebase 認証をおすすめします。

認証フロー

アプリケーションがユーザーの代わりにリソースにアクセスする必要がある場合、そのアプリケーションはユーザーに同意画面を提示します。ユーザーがアクセスを許可すると、アプリケーションは承認サーバーに認証情報を要求します。認証情報によって、アプリケーションはユーザーの代わりにリソースにアクセスできます。

このプロセスは OAuth 2.0 と呼ばれるプロトコルです。

OAuth 2.0 フロー
アプリ
ユーザーの同意
ユーザーデータ

OAuth 2.0 の詳細については、OAuth 2.0 をご覧ください。

API スコープの指定

GCP API への認証にサービス アカウントを使用すると、GCP は API に対する完全アクセス権を持つサービス アカウントを自動的に認証します。エンドユーザーとして認証する場合は、OAuth スコープを手動で指定する必要があります。OAuth スコープにより、アプリケーションがエンドユーザーの代わりに実行できる操作が制限されます。たとえば、これらの操作には Cloud Storage からの読み込みや、GCP プロジェクトの管理などが含まれます。

使用可能な OAuth スコープの詳細については、特定の API ページをご覧ください。たとえば、Compute Engine API に disks.get() メソッドを使用する場合は、これらの OAuth スコープのいずれかを設定する必要があります。ユースケースに基づいて必要な最小スコープを設定します。

プロジェクト リソースへのアクセスの許可と制限

エンドユーザー認証情報を使用してプロジェクト内のリソースにアクセスする場合は、プロジェクト内のリソースへのユーザー アクセス権を付与する必要があります。Google Cloud Identity and Access Management(Cloud IAM)に役割を設定することで、GCP でこれを行います。

ユーザーがアクセスできるリソースを制限することができます。これは、所有するプロジェクトのリソースにユーザーがアクセスできるようにしている場合が特に該当します。ユーザーが必要とする最低限の権限に従って役割を設定します。

各サービスには一連の Cloud IAM の役割があります。代わりにカスタムの役割を作成することもできます。詳細については、役割についてカスタムの役割の作成と管理をご覧ください。

エンドユーザーの認証の例

エンドユーザーの認証情報を取得するには、以下の各セクションに記載されている手順を実行します。以下に示す手順では BigQuery API を使用しますが、クライアント ライブラリを持つすべての GCP API でこのプロセスを再現できます。

プロジェクトの設定

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %}GCP Console プロジェクトをセットアップします。

    プロジェクトをセットアップする

    クリックして、以下を行います。

    • プロジェクトを作成または選択します。
    • プロジェクトに{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • サービス アカウントを作成します。
    • JSON として秘密鍵をダウンロードします。
    • {% dynamic endif %}

    これらのリソースは、GCP Console でいつでも表示および管理できます。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %}{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。 {% dynamic endif %}

    {% dynamic if "," in setvar.api_list %}API{% dynamic else %}API{% dynamic endif %}を有効にする

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  6. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  7. BigQuery クライアント ライブラリをインストールします。
  8. Python または Node.js を使用する場合は、追加の認証ライブラリをインストールする必要があります。

    Python

    Google Auth と統合した oauthlib をインストールします。

    pip install --upgrade google-auth-oauthlib

クライアント認証情報の作成

Google Cloud Platform Console でクライアント認証情報を作成します。

  1. GCP Console で OAuth 同意画面に移動します。

  2. 認証情報ページで、[認証情報を作成] ボタンを選択して [OAuth クライアント ID] を選択します。

  3. [その他] を選択し、[作成] ボタンを選択します。成功を示すダイアログが表示されたら、[OK] ボタンを選択します。

  4. クライアント ID の [JSON をダウンロード] ボタンをクリックして、認証情報をダウンロードします。

    [JSON をダウンロード] ボタン

  5. 認証情報ファイルを client_secrets.json に保存します。このファイルはアプリケーションとともに配布する必要があります。

API の認証と呼び出し

  1. クライアント認証情報を使用して OAuth 2.0 フローを行います。

    Python

    from google_auth_oauthlib import flow
    
    # TODO: Uncomment the line below to set the `launch_browser` variable.
    # launch_browser = True
    #
    # The `launch_browser` boolean variable indicates if a local server is used
    # as the callback URL in the auth flow. A value of `True` is recommended,
    # but a local server does not work if accessing the application remotely,
    # such as over SSH or from a remote Jupyter notebook.
    
    appflow = flow.InstalledAppFlow.from_client_secrets_file(
        'client_secrets.json',
        scopes=['https://www.googleapis.com/auth/bigquery'])
    
    if launch_browser:
        appflow.run_local_server()
    else:
        appflow.run_console()
    
    credentials = appflow.credentials

  2. 認証済みの認証情報を使用して BigQuery API に接続します。

    Python

    from google.cloud import bigquery
    
    # TODO: Uncomment the line below to set the `project` variable.
    # project = 'user-project-id'
    #
    # The `project` variable defines the project to be billed for query
    # processing. The user must have the bigquery.jobs.create permission on
    # this project to run a query. See:
    # https://cloud.google.com/bigquery/docs/access-control#permissions
    
    client = bigquery.Client(project=project, credentials=credentials)
    
    query_string = """SELECT name, SUM(number) as total
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE name = 'William'
    GROUP BY name;
    """
    query_job = client.query(query_string)
    
    # Print the results.
    for row in query_job.result():  # Wait for the job to complete.
        print("{}: {}".format(row['name'], row['total']))

サンプルコードを実行すると、クライアント シークレットに関連付けられたプロジェクトへのアクセスを要求するブラウザが起動します。このサンプルは BigQuery スコープを要求しているため、生成された認証情報を使用してユーザーの BigQuery リソースにアクセスできます。

別のユースケースでは、IAM の役割を追加して、ユーザーがアクセスできるリソースを決定できます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...