Como autenticar como usuário final

Na maioria das situações, recomendamos o uso de uma conta de serviço para autenticação em uma API do Google Cloud Platform (GCP). Em algumas situações, convém que os usuários se autentiquem diretamente. Por exemplo:

  • Você precisa acessar os recursos em nome de um usuário final do seu aplicativo. Por exemplo, seu aplicativo precisa acessar conjuntos de dados do Google BigQuery que pertencem aos próprios usuários do aplicativo.

  • Você precisa autenticar como você mesmo em vez de autenticar como seu aplicativo. Por exemplo, como a API Cloud Resource Manager pode criar e gerenciar projetos de um usuário específico, você precisará autenticar como usuário para criar projetos em nome dele.

Neste guia, abordamos as credenciais do usuário final. Não trata de como autenticar um usuário no seu aplicativo. Para este caso de uso, recomendamos o Firebase Authentication.

Fluxo de autenticação

Quando um aplicativo precisa acessar recursos em nome de um usuário, é exibida uma tela de consentimento. Assim que o usuário aceita, seu aplicativo solicita as credenciais de um servidor de autorização. Com elas, ele pode acessar recursos em nome do usuário.

Esse processo é um protocolo denominado OAuth 2.0.

Fluxo do OAuth 2.0
Seu app
Consentimento do usuário
Dados do usuário

Para saber mais sobre o OAuth 2.0, consulte OAuth 2.0.

Como especificar escopos de API

Quando você usa uma conta de serviço para se autenticar em uma API do GCP, o GCP autentica automaticamente a conta de serviço com acesso total à API. Ao autenticar-se como usuário final, você precisa especificar escopos do OAuth manualmente. Os escopos do OAuth limitam as ações que seu aplicativo pode executar em nome do usuário final. Por exemplo, essas ações podem incluir a leitura de arquivos do Cloud Storage ou o gerenciamento de projetos do GCP.

Consulte a página da API específica para mais informações sobre quais escopos do OAuth estão disponíveis. Por exemplo, se você planeja usar o método disks.get() para a API Compute Engine, precisará definir um desses escopos do OAuth. Defina o escopo mínimo necessário com base no seu caso de uso.

Como conceder e limitar o acesso aos recursos do projeto

Se você estiver usando credenciais de usuário final para acessar recursos dentro do seu projeto, precisará conceder ao usuário acesso a eles. Para isso, acesse o GCP e defina um papel no Google Cloud Identity and Access Management (Cloud IAM).

Pode ser necessário limitar o acesso do usuário a alguns recursos, especialmente quando ele tem permissão para acessar recursos em um projeto seu. Defina os papéis de acordo com o privilégio mínimo que o usuário precisa.

Cada serviço tem um conjunto de papéis do Cloud IAM, mas é possível criar papéis personalizados. Para mais informações, consulte Como entender os papéis e Como criar e gerenciar papéis personalizados.

Exemplo de autenticação do usuário final

Conclua as seções a seguir para conseguir credenciais para um usuário final. As etapas a seguir usam a API BigQuery, mas é possível replicar esse processo com qualquer API GCP que tenha uma biblioteca de cliente.

Como configurar o projeto

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do GCP, na página do seletor de projetos, selecione ou crie um projeto do GCP.

    Acesse a página do seletor de projetos

  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform. Saiba como confirmar que o faturamento está ativado para seu projeto.

  4. Ative a(s) BigQuery API necessária(s).

    Ativar a(s) API

  5. Instale as bibliotecas de cliente do BigQuery.
  6. Se você estiver usando Python ou Node.js, precisará instalar mais uma biblioteca de autenticação.

    Python

    Instale a integração oauthlib para o Google Auth.

    pip install --upgrade google-auth-oauthlib

Como criar as credenciais de cliente

Crie as credenciais de cliente no Console do Google Cloud Platform.

  1. Acesse a página da tela de consentimento do OAuth no Console do GCP.

  2. Na página Credenciais, selecione o botão Criar credenciais e selecione o ID do cliente do OAuth.

  3. Selecione Outro e clique no botão Criar. Selecione o botão OK quando a caixa de diálogo de sucesso for exibida.

  4. Para fazer o download das credenciais, clique no botão Fazer o download do JSON referente ao ID do cliente.

    Botão

  5. Salve o arquivo de credenciais em client_secrets.json. Esse arquivo precisa ser distribuído com seu aplicativo.

Como autenticar e chamar a API

  1. Use as credenciais de cliente para executar o fluxo do OAuth 2.0.

    Python

    Ver no GitHub (em inglês)
    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. Use as credenciais autenticadas para se conectar à API BigQuery.

    Python

    Ver no GitHub (em inglês)
    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']))

Quando você executar o código de amostra, ele iniciará um navegador solicitando acesso ao projeto associado às chaves secretas do cliente. As credenciais resultantes poderão ser usadas para acessar os recursos do BigQuery do usuário, porque na amostra foi solicitado o escopo do BigQuery.

Em um caso de uso diferente, convém adicionar papéis do IAM para determinar o que o usuário pode acessar.

A seguir