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

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

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

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

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

認証フロー

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

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

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

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

API スコープの指定

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

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

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

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

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

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

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

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

プロジェクトの設定

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

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

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

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

  4. BigQuery API を有効にします。

    API を有効にする

  5. BigQuery クライアント ライブラリをインストールします。
  6. Python または Node.js を使用する場合は、追加の認証ライブラリをインストールする必要があります。

    Python

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

    pip install --upgrade google-auth-oauthlib

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

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

  1. Cloud 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 リソースにアクセスできます。

別のユースケースでは、Cloud IAM のロールを付与して、ユーザーがアクセスできるリソースを決定できます。

次のステップ