Sobre tokens de acesso do usuário
Observação
Os tokens de acesso do usuário que expiram são, atualmente, um recurso opcional e estão sujeitos a alterações. Para aceitar ou recusar o recurso de vencimento de token, confira Ativando recursos opcionais para aplicativos do GitHub. Para obter mais informações, confira Como expirar tokens de acesso de usuário para servidor para Aplicativos do GitHub.
Se um usuário relatar que não pode ver recursos pertencentes à organização depois de autorizar o GitHub App e a organização estiver usando o SSO do SAML, instrua-o a iniciar uma sessão SAML ativa para a organização antes de reautorizar. Para obter mais informações, confira SAML e aplicativos GitHub na documentação do GitHub Enterprise Cloud.
Um token de acesso do usuário é um tipo de token OAuth. Ao contrário de um token OAuth tradicional, o token de acesso do usuário não usa escopos. Em vez disso, ele usa permissões refinadas. Um token de acesso do usuário só tem permissões que o usuário e o aplicativo têm. Por exemplo, se o aplicativo recebeu permissão para gravar o conteúdo de um repositório, mas o usuário só pode ler o conteúdo, o token de acesso do usuário só pode ler o conteúdo.
Da mesma forma, um token de acesso do usuário só pode acessar recursos que o usuário e o aplicativo podem acessar. Por exemplo, se um aplicativo receber acesso ao repositório A e B, e o usuário puder acessar o repositório B e C, o token de acesso do usuário poderá acessar o repositório B, mas não A ou C. Use a API REST para verificar quais instalações e quais repositórios em uma instalação um token de acesso do usuário pode acessar. Para obter mais informações, confira GET /user/installations e GET /user/installations/{installation_id}/repositories em Pontos de extremidade da API REST para instalações do GitHub App.
Quando você faz solicitações de API com um token de acesso do usuário, os limites de taxa para os tokens de acesso do usuário se aplicam. Para saber mais, confira Limites de taxa para aplicativos GitHub.
Por padrão, o token de acesso do usuário expira após oito horas. Use um token de atualização para regenerar um token de acesso do usuário. Para saber mais, confira Atualizar tokens de acesso do usuário.
Os usuários podem revogar a autorização de um GitHub App. Para saber mais, confira Vencimento e revogação de token. Se um usuário revogar a autorização de um GitHub App, o aplicativo receberá o webhook github_app_authorization. O GitHub Apps não pode cancelar a assinatura deste evento. Se o aplicativo receber esse webhook, você deverá parar de chamar a API em nome do usuário que revogou o token. Se o aplicativo continuar usando um token de acesso revogado, ele receberá o erro 401 Bad Credentials. Para obter mais informações sobre esse webhook, confira Eventos e cargas de webhook.
Você deve manter seguros os tokens de acesso do usuário e os tokens de atualização. Para saber mais, confira Práticas recomendadas para criar um aplicativo do GitHub.
Como usar o fluxo do aplicativo Web para gerar um token de acesso do usuário
Se o aplicativo for executado no navegador, você deverá usar o fluxo do aplicativo Web para gerar um token de acesso do usuário. Para ver um tutorial sobre como usar o fluxo de aplicativo Web, confira Criando um botão "Fazer logon com o GitHub" com um Aplicativo GitHub.
-
Direcione o usuário para essa URL e adicione todos os parâmetros de consulta necessários da seguinte lista de parâmetros:
http(s)://HOSTNAME/login/oauth/authorize. Por exemplo, esta URL especifica os parâmetrosclient_idestate:http(s)://HOSTNAME/login/oauth/authorize?client_id=12345&state=abcdefg.Parâmetro de consulta Tipo Necessário? Descrição client_idstringObrigatório A ID do cliente do GitHub App. A ID do cliente é diferente da ID do aplicativo. Encontre a ID do aplicativo na página de configurações do aplicativo. Para saber como acessar a página de configurações do GitHub App, confira Modificar um registro do Aplicativo GitHub. redirect_uristringAltamente recomendado A URL no seu aplicativo para o qual os usuários serão enviados após a autorização. Isso precisa ser uma correspondência exata com uma das URLs fornecidas como uma "URL de retorno de chamada" nas configurações do aplicativo e não pode conter parâmetros adicionais. statestringAltamente recomendado Quando especificado, o valor deve conter uma cadeia de caracteres aleatória para proteção contra ataques falsificados e pode conter outros dados arbitrários. login|string| Opcional | Quando especificado, o fluxo do aplicativo Web solicitará aos usuários uma conta específica que possam usar para entrar e autorizar seu aplicativo.allow_signup|boolean| Opcional | Indica se os usuários não autenticados terão a opção de se inscrever no GitHub durante o fluxo do OAuth. O padrão étrue. Usefalsequando uma política proibir inscrições.prompt|string| Opcional | Força o seletor de contas a aparecer se definido comoselect_account. O seletor de conta também aparecerá se o aplicativo tiver um URI de redirecionamento não HTTP ou se o usuário tiver sessões iniciadas em várias contas. -
Se o usuário aceitar sua solicitação de autorização, o GitHub redirecionará o usuário para uma das URLs de retorno de chamada nas configurações de aplicativo e fornecerá um parâmetro de consulta
codeque você poderá usar na próxima etapa para criar um token de acesso do usuário. Se você especificouredirect_urina etapa anterior, essa URL de retorno de chamada será usada. Caso contrário, a primeira URL de retorno de chamada na página de configurações do aplicativo será usada.Se você especificou o parâmetro
statena etapa anterior, o GitHub também incluirá um parâmetrostate. Se o parâmetrostatenão corresponder ao parâmetrostateque você enviou na etapa anterior, a solicitação não poderá ser confiável e o fluxo do aplicativo Web deverá ser anulado. -
Troque o
codeda etapa anterior por um token de acesso do usuário fazendo uma solicitaçãoPOSTpara essa URL com os seguintes parâmetros de consulta:http(s)://HOSTNAME/login/oauth/access_tokenParâmetro de consulta Tipo Descrição client_idstringNecessário. A ID do cliente do GitHub App. A ID do cliente é diferente da ID do aplicativo. Encontre a ID do aplicativo na página de configurações do aplicativo. Para saber como acessar a página de configurações do GitHub App, confira Modificar um registro do Aplicativo GitHub. client_secretstringObrigatório. O segredo do cliente para seu GitHub App. Você pode gerar um segredo do cliente na página de configurações do aplicativo. codestringNecessário. O código que você recebeu na etapa anterior. redirect_uristringA URL no seu aplicativo para o qual os usuários serão enviados após a autorização. Ela deve ser uma correspondência exata de uma das URLs que você forneceu como uma "URL de retorno de chamada" ao configurar o GitHub App e não pode conter parâmetros adicionais. repository_id|string| A ID de um único repositório que o token de acesso do usuário pode acessar. Se o GitHub App ou o usuário não puder acessar o repositório, isso será ignorado. Use esse parâmetro para restringir ainda mais o acesso do token de acesso do usuário. -
O GitHub dará uma resposta que inclui os seguintes parâmetros:
Parâmetro de resposta Type Descrição access_tokenstringO token de acesso do usuário. O token começa com ghu_.expires_inintegerO número de segundos até a expiração do access_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será28800(oito horas).refresh_tokenstringO token de atualização. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O token começa com ghr_.refresh_token_expires_inintegerO número de segundos até a expiração do refresh_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será15897600(seis meses).scopestringOs escopos que o token tem. Esse valor sempre será uma cadeia de caracteres vazia. Ao contrário de um token OAuth tradicional, o token de acesso do usuário é limitado às permissões que o seu aplicativo e o usuário têm. token_typestringO tipo de token. O valor sempre será bearer. -
Use o token de acesso do usuário da etapa anterior para fazer solicitações de API em nome do usuário. Inclua o token de acesso do usuário no cabeçalho
Authorizationde uma solicitação de API. Por exemplo:curl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
Como usar o fluxo do dispositivo para gerar um token de acesso do usuário
Observação
O fluxo de dispositivos está em versão prévia pública e está sujeito a alterações.
Se o aplicativo não tiver periféricos ou não tiver acesso a um navegador, use o fluxo do dispositivo para gerar um token de acesso do usuário. Por exemplo, as ferramentas da CLI, Raspberry Pis simples e os aplicativos da área de trabalho devem usar o fluxo do dispositivo. Para ver um tutorial que usa o fluxo do dispositivo, confira Criando uma CLI com um Aplicativo GitHub.
Antes de usar o fluxo do dispositivo, você deve primeiro habilitá-lo nas configurações do aplicativo. Para obter mais informações sobre como habilitar o fluxo do dispositivo, confira Modificar um registro do Aplicativo GitHub.
O fluxo do dispositivo usa a Concessão de Autorização de Dispositivo do OAuth 2.0.
-
Envie uma solicitação
POSTparahttp(s)://HOSTNAME/login/device/codecom um parâmetro de consultaclient_id. A ID do cliente é diferente da ID do aplicativo. Encontre a ID do aplicativo na página de configurações do aplicativo. Para saber como acessar a página de configurações do GitHub App, confira Modificar um registro do Aplicativo GitHub. -
O GitHub dará uma resposta que inclui os seguintes parâmetros de consulta:
Parâmetro de resposta Type Descrição device_codestringUm código de verificação usado para verificar o dispositivo. Esse código tem 40 caracteres. user_codestringUm código de verificação que o seu aplicativo deve exibir para que o usuário possa inserir o código em um navegador. Este código tem 8 caracteres com um hífen no meio. Por exemplo, WDJB-MJHT.verification_uristringA URL em que os usuários precisam inserir o user_code. A URL é:http(s)://HOSTNAME/login/device.expires_inintegerO número de segundos antes que o device_codee ouser_codeexpirem. O padrão é 900 segundos (ou 15 minutos).intervalintegerO número mínimo de segundos que precisa transcorrer para que você possa fazer uma nova solicitação de token de acesso ( POST http(s)://HOSTNAME/login/oauth/access_token) a fim de concluir a autorização do dispositivo. Se você fizer uma solicitação antes do intervalo transcorrer, atingirá o limite de taxa e receberá o erroslow_down. O padrão é 5 segundos. -
Solicite que o usuário insira o
user_codeda etapa anterior nahttp(s)://HOSTNAME/login/device.Se o usuário não inserir o código antes da hora de
expires_intranscorrer, o código será inválido. Nesse caso, você deve reiniciar o fluxo do dispositivo. -
Sonde
POST http(s)://HOSTNAME/login/oauth/access_tokencom os parâmetros de consultaclient_id,device_codeegrant_type(descritos abaixo) até que os códigos do dispositivo e do usuário expirem ou o usuário tenha autorizado o aplicativo com sucesso inserindo ouser_code.Parâmetro de consulta Tipo Descrição client_idstringNecessário. A ID do cliente do GitHub App. device_codestringNecessário. O código de verificação do dispositivo que você recebeu na etapa anterior. grant_typestringNecessário. O tipo de concessão precisa ser urn:ietf:params:oauth:grant-type:device_code.repository_idstringA ID de um único repositório que o token de acesso do usuário pode acessar. Se o GitHub App ou o usuário não puder acessar o repositório, isso será ignorado. Use esse parâmetro para restringir ainda mais o acesso do token de acesso do usuário. Não sonde esse ponto de extremidade com uma frequência mais alta do que a frequência indicada por
interval. Se você fizer isso, atingirá o limite de taxa e receberá o erroslow_down. A resposta de erroslow_downadiciona cinco segundos ao últimointerval.Até que o usuário insira o código, GitHub responderá com 200 status e um parâmetro de consulta de resposta
error.Nome do erro Descrição authorization_pendingEste erro ocorre quando a solicitação de autorização está pendente e o usuário ainda não inseriu o código do usuário. É esperado que o aplicativo continue sondando o POST http(s)://HOSTNAME/login/oauth/access_tokencom uma frequência não mais rápida do que a frequência especificada porinterval.slow_downQuando você recebe o erro slow_down, cinco segundos extras são adicionados aointervalou ao período mínimo necessário entre as solicitações por meio dePOST http(s)://HOSTNAME/login/oauth/access_token. Por exemplo, se o intervalo inicial exigir, pelo menos, cinco segundos entre as solicitações e você receber a resposta de erroslow_down, você precisará aguardar, no mínimo, dez segundos antes de fazer uma nova solicitação para um token. A resposta de erro inclui o novointervalque você precisa usar.expired_tokenSe o código do dispositivo expirar, você verá o erro token_expired. Você deve fazer uma nova solicitação para um código de dispositivo.unsupported_grant_typeO tipo de concessão precisa ser urn:ietf:params:oauth:grant-type:device_codee precisa ser incluído como um parâmetro de entrada quando a solicitação de token OAuthPOST http(s)://HOSTNAME/login/oauth/access_tokené sondada.incorrect_client_credentialsPara o fluxo do dispositivo, você deve passar o ID de cliente do aplicativo, que pode ser encontrado na página de configurações do aplicativo. A ID do cliente é diferente da ID do aplicativo e do segredo do cliente. incorrect_device_codeO device_codefornecido não é válido.access_deniedQuando um usuário clicar em Cancelar durante o processo de autorização, você receberá o erro access_deniede o usuário não poderá usar o código de verificação novamente.device_flow_disabledO fluxo do dispositivo não foi habilitado nas configurações do aplicativo. Para obter mais informações sobre como habilitar o fluxo do dispositivo, confira Modificar um registro do Aplicativo GitHub. -
Depois que o usuário inserir o
user_code, o GitHub terá uma resposta que inclui os seguintes parâmetros de consulta:Parâmetro de resposta Type Descrição access_tokenstringO token de acesso do usuário. O token começa com ghu_.expires_inintegerO número de segundos até a expiração do access_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será28800(oito horas).refresh_tokenstringO token de atualização. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O token começa com ghr_.refresh_token_expires_inintegerO número de segundos até a expiração do refresh_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será15897600(seis meses).scopestringOs escopos que o token tem. Esse valor sempre será uma cadeia de caracteres vazia. Ao contrário de um token OAuth tradicional, o token de acesso do usuário é limitado às permissões que o seu aplicativo e o usuário têm. token_typestringO tipo de token. O valor sempre será bearer. -
Use o token de acesso do usuário da etapa anterior para fazer solicitações de API em nome do usuário. Inclua o token de acesso do usuário no cabeçalho
Authorizationde uma solicitação de API. Por exemplo:curl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
Como gerar um token de acesso do usuário quando um usuário instala seu aplicativo
Se você selecionar Solicitar autorização do usuário (OAuth) durante a instalação nas configurações do aplicativo, o GitHub iniciará o fluxo do aplicativo Web imediatamente depois que um usuário instalar seu aplicativo.
Você pode gerar um token de acesso do usuário com esse método, independentemente de o aplicativo estar instalado em uma conta de usuário ou em uma conta de organização. No entanto, se o aplicativo tiver sido instalado em uma conta de organização, você precisará usar o fluxo do aplicativo Web ou o fluxo do dispositivo para gerar um token de acesso do usuário para outros usuários da organização.
-
Quando um usuário instalar seu aplicativo, o GitHub redirecionará o usuário para
http(s)://HOSTNAME/login/oauth/authorize?client_id=CLIENT_ID, em queCLIENT_IDé a ID do cliente do aplicativo. -
Se o usuário aceitar sua solicitação de autorização, o GitHub redirecionará o usuário para a primeira URL de retorno de chamada nas configurações do aplicativo e fornecerá um parâmetro de consulta
code.Caso você deseje controlar a URL de retorno de chamada que é usada, não selecione Solicitar autorização do usuário (OAuth) durante a instalação. Em vez disso, direcione os usuários pelo fluxo completo do aplicativo Web e especifique o parâmetro
redirect_uri. -
Troque o
codeda etapa anterior por um token de acesso do usuário fazendo uma solicitaçãoPOSTpara essa URL com os seguintes parâmetros de consulta:http(s)://HOSTNAME/login/oauth/access_tokenParâmetro de consulta Tipo Descrição client_idstringNecessário. A ID do cliente do GitHub App. A ID do cliente é diferente da ID do aplicativo. Encontre a ID do aplicativo na página de configurações do aplicativo. Para saber como acessar a página de configurações do GitHub App, confira Modificar um registro do Aplicativo GitHub. client_secretstringObrigatório. O segredo do cliente para seu GitHub App. Você pode gerar um segredo do cliente na página de configurações do aplicativo. codestringNecessário. O código que você recebeu na etapa anterior. redirect_uristringA URL no seu aplicativo para o qual os usuários serão enviados após a autorização. Ela deve ser uma correspondência exata de uma das URLs que você forneceu como uma "URL de retorno de chamada" ao configurar o GitHub App e não pode conter parâmetros adicionais. repository_id|string| A ID de um único repositório que o token de acesso do usuário pode acessar. Se o GitHub App ou o usuário não puder acessar o repositório, isso será ignorado. Use esse parâmetro para restringir ainda mais o acesso do token de acesso do usuário. -
O GitHub dará uma resposta que inclui os seguintes parâmetros:
Parâmetro de resposta Type Descrição access_tokenstringO token de acesso do usuário. O token começa com ghu_.expires_inintegerO número de segundos até a expiração do access_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será28800(oito horas).refresh_tokenstringO token de atualização. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O token começa com ghr_.refresh_token_expires_inintegerO número de segundos até a expiração do refresh_token. Se você desabilitar a expiração de tokens de acesso do usuário, esse parâmetro será omitido. O valor sempre será15897600(seis meses).scopestringOs escopos que o token tem. Esse valor sempre será uma cadeia de caracteres vazia. Ao contrário de um token OAuth tradicional, o token de acesso do usuário é limitado às permissões que o seu aplicativo e o usuário têm. token_typestringO tipo de token. O valor sempre será bearer. -
Use o token de acesso do usuário da etapa anterior para fazer solicitações de API em nome do usuário. Inclua o token de acesso do usuário no cabeçalho
Authorizationde uma solicitação de API. Por exemplo:curl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
Como usar um token de atualização para gerar um token de acesso do usuário
Por padrão, os tokens de acesso do usuário expiram após oito horas. Se você receber um token de acesso do usuário com uma expiração, também receberá um token de atualização. O token de atualização expira após seis meses. Use esse token de atualização para regenerar um token de acesso do usuário. Para saber mais, confira Atualizar tokens de acesso do usuário.
O GitHub incentiva fortemente você a usar tokens de acesso do usuário que expiram. Se você já recusou o uso de tokens de acesso do usuário que expiram, mas deseja habilitar esse recurso novamente, confira Ativando recursos opcionais para aplicativos do GitHub.
Solução de problemas
As seções a seguir descrevem alguns erros que você pode receber ao gerar um token de acesso do usuário.
Credenciais do cliente incorretas
Se o client_id ou o client_secret especificado estiver incorreto, você receberá um erro incorrect_client_credentials.
Para resolver esse erro, use as credenciais corretas do GitHub App. Encontre a ID do cliente e o segredo do cliente na página de configurações do GitHub App. Para saber como acessar a página de configurações do GitHub App, confira Modificar um registro do Aplicativo GitHub.
Erro no redirecionamento do URI
Se você especificar um redirect_uri que não corresponda a uma das URLs de retorno de chamada no registro do GitHub App, ocorrerá um erro redirect_uri_mismatch.
Para resolvê-lo, forneça um redirect_uri que corresponda a uma das URLs de retorno de chamada do registro do GitHub App ou omita esse parâmetro para usar a primeira URL de retorno de chamada listada no registro do GitHub App. Para saber mais, confira Sobre a URL de retorno de chamada de autorização do usuário.
Código de verificação incorreto
Se você estiver usando o fluxo do dispositivo e o código de verificação (device_code) especificado estiver incorreto, expirado ou não corresponder ao valor recebido da solicitação inicial para http(s)://HOSTNAME/login/device/code, ocorrerá um erro bad_verification_code.
Para resolver esse erro, você deve iniciar o fluxo do dispositivo novamente para obter um novo código. Para obter mais informações, confira Como usar o fluxo de dispositivo para gerar um token de acesso do usuário.
Token de atualização inválido
Se o token de atualização especificado for inválido ou estiver expirado, você receberá um erro bad_refresh_token.
Para resolver esse erro, você precisa reiniciar o fluxo de aplicativo Web ou o fluxo do dispositivo para obter um novo token de acesso do usuário e um token de atualização. Você só receberá um token de atualização se o GitHub App estiver configurado para aceitar a expiração de tokens de acesso do usuário. Para saber mais, confira Atualizar tokens de acesso do usuário.
Tipo de concessão sem suporte
Quando você solicita um token de acesso de usuário por meio do fluxo do dispositivo, o parâmetro grant_type precisa ser urn:ietf:params:oauth:grant-type:device_code. Quando você atualiza um token de acesso do usuário usando um token de atualização, o parâmetro grant_type precisa ser refresh_token. Se você não usar o tipo de concessão correto, receberá um erro unsupported_grant_type.
Email de usuário não verificado
Se o usuário para o qual você está tentando gerar um token de acesso do usuário não tiver verificado o endereço de email principal com o GitHub, você receberá um erro unverified_user_email.
Para resolver esse erro, solicite ao usuário que verifique o endereço de email principal na conta do GitHub. Para obter mais informações, confira Verifying your email address na documentação do GitHub Free.