以使用者身分的進行驗證

大多數情況下,我們會建議您使用服務帳戶進行 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. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

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

  4. 啟用BigQuery必要的 。

    啟用 API

  5. 安裝 BigQuery 用戶端程式庫
  6. 如果您使用的是 Python 或 Node.js,則須安裝其他驗證資料庫。

    Python

    安裝適用於 Google Auth 的 oauthlib 整合項目

    pip install --upgrade google-auth-oauthlib

建立用戶端憑證

在 Google Cloud Platform Console 中建立用戶端憑證。

  1. 前往 GCP Console 的「OAuth consent screen」(OAuth 同意畫面) 頁面。

  2. 選取「Credentials」(憑證) 頁面中的 [Create credentials] (建立憑證) 按鈕,然後選取 [OAuth Client ID] (OAuth 用戶端 ID)

  3. 選取 [Other] (其他),接著選取 [Create] (建立) 按鈕。在畫面中顯示作業成功的對話方塊之後,選取 [OK] (確定) 按鈕。

  4. 按一下用戶端 ID 的 [Download JSON] (下載 JSON) 按鈕來下載憑證。

    「Download 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 角色來決定使用者可以存取的內容。

後續步驟

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

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

這個網頁