以使用者身分進行驗證

大多數情況下,我們都建議使用服務帳戶通過 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 身分與存取權管理 (Cloud IAM) 中設定角色,在 GCP 中執行這項作業。

您可能想要限制使用者可以存取的資源,當您允許使用者存取您擁有的專案中資源時尤為如此。請根據使用者需要的最低權限設定角色。

每個服務都有一組 Cloud IAM 角色,您也可以選擇建立自訂角色。詳情請參閱瞭解角色建立和管理自訂角色

使用者驗證範例

完成以下各節,取得使用者的憑證。下列步驟使用的是 BigQuery API,但您可以使用具有用戶端程式庫的任何 GCP API 重複這一流程。

設定專案

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. 啟用 BigQuery API。

    啟用 API

  5. 安裝 BigQuery 用戶端程式庫
  6. 若使用 Python 或 Node.js,您必須安裝其他驗證程式庫。

    Python

    安裝適用於 Google Auth 的 oauthlib 整合

    pip install --upgrade google-auth-oauthlib

建立用戶端憑證

在 Google Cloud Platform 主控台中,建立用戶端憑證。

  1. 在 GCP 主控台中,前往 API 和服務→憑證頁面。

  2. 填寫 OAuth 同意畫面中的必填欄位。

  3. 按一下 [Create credentials] (建立憑證) 按鈕,然後選取 [OAuth Client ID] (OAuth 用戶端 ID)

  4. 選取 [Other] (其他),然後按一下 [Create] (建立) 按鈕。

  5. 按一下 [Download JSON] (下載 JSON) 按鈕下載憑證。

    下載 JSON 按鈕

  6. 將憑證檔案儲存到 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 範圍

在其他使用案例中,您可能想要新增身分與存取權管理角色來決定使用者可存取的內容。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁