Sempre recebo um invalid_grant
erro ao tentar obter um token oAuth do Google para se conectar à API de contatos. Todas as informações estão corretas e eu verifiquei isso de forma meio perplexa.
Alguém sabe o que pode estar causando esse problema? Eu tentei configurar um ID de cliente diferente para ele, mas obtive o mesmo resultado, tentei conectar de várias maneiras diferentes, incluindo a tentativa de autenticação forçada, mas ainda o mesmo resultado.
google-api
André Figueira
fonte
fonte
Respostas:
Eu tive esse problema quando não solicitei explicitamente o acesso "offline" ao enviar o usuário para o OAuth "Deseja dar a este aplicativo permissão para tocar nas suas coisas?" página.
Certifique-se de especificar access_type = offline em sua solicitação.
Detalhes aqui: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Além disso: acho que o Google adicionou essa restrição no final de 2011. Se você tiver tokens antigos de antes dessa data, precisará enviar seus usuários à página de permissão para autorizar o uso off-line.)
fonte
access_type
paraoffline
, este erro ainda acontece.Encontrei o mesmo problema, apesar de especificar "offline"
access_type
em minha solicitação de acordo com a resposta de bonkydog. Resumindo, descobri que a solução descrita aqui funcionou para mim:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
Em essência, quando você adiciona um cliente OAuth2 ao console da API do Google, o Google fornece um "ID de cliente" e um "endereço de e-mail" (supondo que você selecione "webapp" como seu tipo de cliente). E, apesar das convenções de nomenclatura enganosas do Google, eles esperam que você envie o "endereço de e-mail" como o valor do
client_id
parâmetro ao acessar suas APIs OAuth2.Isso se aplica ao chamar esses dois URLs:
Observe que a chamada para o primeiro URL será bem - sucedida se você chamá-lo com seu "ID do cliente" em vez de seu "endereço de e-mail". No entanto, usar o código retornado dessa solicitação não funcionará ao tentar obter um token de portador do segundo URL. Em vez disso, você receberá um 'Erro 400' e uma mensagem "invalid_grant".
fonte
Embora esta seja uma questão antiga, parece que muitos ainda a encontram - passamos dias a fio rastreando isso nós mesmos.
Na especificação OAuth2, "invalid_grant" é uma espécie de pega-tudo para todos os erros relacionados a tokens inválidos / expirados / revogados (concessão de autorização ou token de atualização).
Para nós, o problema era duplo:
O usuário revogou ativamente o acesso ao nosso aplicativo
Faz sentido, mas veja só: 12 horas após a revogação, o Google para de enviar a mensagem de erro em sua resposta:
“error_description” : “Token has been revoked.”
É um tanto enganoso porque você presumirá que a mensagem de erro está lá o tempo todo, o que não é O caso. Você pode verificar se seu aplicativo ainda tem acesso na página de permissão de aplicativos .
O usuário redefiniu / recuperou sua senha do Google
Em dezembro de 2015, o Google mudou seu comportamento padrão para que as redefinições de senha para usuários que não fossem do Google Apps revogassem automaticamente todos os tokens de atualização de aplicativos do usuário. Na revogação, a mensagem de erro segue a mesma regra do caso anterior, então você só receberá a "descrição_de_erro" nas primeiras 12 horas. Não parece haver nenhuma maneira de saber se o usuário revogou o acesso manualmente (com intenção) ou se aconteceu devido a uma redefinição de senha (efeito colateral).
Além dessas, há uma miríade de outras causas potenciais que podem desencadear o erro:
Escrevi um pequeno artigo resumindo cada item com algumas orientações de depuração para ajudar a encontrar o culpado. Espero que ajude.
fonte
Eu encontrei o mesmo problema. Para mim, eu corrigi isso usando o endereço de e-mail (a string que termina com ... @ developer.gserviceaccount.com) em vez do ID do cliente para o valor do parâmetro client_id. A nomenclatura definida pelo Google é confusa aqui.
fonte
Meu problema é que usei este URL:
Quando deveria ter usado este URL:
Isso estava testando uma conta de serviço que desejava acesso offline ao mecanismo de armazenamento .
fonte
Eu tive a mesma mensagem de erro 'invalid_grant' e foi porque o authResult ['code'] enviado do lado do cliente javascript não foi recebido corretamente no servidor.
Tente enviar de volta do servidor para ver se está correto e não uma string vazia.
fonte
se você estiver usando a biblioteca de escriba, apenas configure o modo offline, como o bonkydog sugerido aqui está o código:
https://github.com/codolutions/scribe-java/
fonte
Usando um clientId Android (sem client_secret), obtive a seguinte resposta de erro:
Não consigo encontrar nenhuma documentação para o campo 'code_verifier', mas descobri que se você configurá-lo com valores iguais nas solicitações de autorização e de token, esse erro será removido. Não tenho certeza de qual deve ser o valor pretendido ou se deve ser seguro. Tem um comprimento mínimo (16? Caracteres), mas descobri que a configuração para
null
também funciona.Estou usando AppAuth para a solicitação de autorização em meu cliente Android, que tem uma
setCodeVerifier()
função.Aqui está um exemplo de solicitação de token no nó:
Eu testei e isso funciona com ambos
https://www.googleapis.com/oauth2/v4/token
ehttps://accounts.google.com/o/oauth2/token
.Se você estiver usando em
GoogleAuthorizationCodeTokenRequest
vez disso:fonte
Esta é uma resposta boba, mas o problema para mim foi que não percebi que já havia recebido um token oAuth ativo para meu usuário do Google, que não consegui armazenar. A solução neste caso é ir para o console da API e redefinir o segredo do cliente.
Existem várias outras respostas no SO para esse efeito, por exemplo Redefinir segredo do cliente OAuth2 - Os clientes precisam conceder acesso novamente?
fonte
Pode ser necessário remover uma resposta OAuth obsoleta / inválida.
Crédito: a amostra do node.js google oauth2 parou de funcionar invalid_grant
Observação : uma resposta do OAuth também se tornará inválida se a senha usada na autorização inicial for alterada.
Se estiver em um ambiente bash, você pode usar o seguinte para remover a resposta obsoleta:
rm /Users/<username>/.credentials/<authorization.json>
fonte
Existem duas razões principais para o erro invalid_grant que você deve tomar cuidado antes da solicitação POST para atualizar o token e o token de acesso.
RFC 6749 OAuth 2.0 definiu invalid_grant como: A concessão de autorização fornecida (por exemplo, código de autorização, credenciais de proprietário de recurso) ou token de atualização é inválido, expirou, revogado, não corresponde ao URI de redirecionamento usado na solicitação de autorização ou foi emitido para outro cliente .
Encontrei outro bom artigo, aqui você encontrará muitos outros motivos para esse erro.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
fonte
neste site console.developers.google.com
esta placa de console selecione seu projeto, insira o url de juramento. o URL de retorno de chamada oauth irá redirecionar quando o oauth for bem-sucedido
fonte
Depois de considerar e tentar todas as outras maneiras aqui, eis como resolvi o problema em nodejs com o
googleapis
módulo em conjunto com orequest
módulo, que usei para buscar os tokens em vez dogetToken()
método fornecido :Eu simplesmente uso
request
para fazer a solicitação da API via HTTP, conforme descrito aqui: https://developers.google.com/identity/protocols/OAuth2WebServer#offlinefonte
Tente mudar o seu url para requst para
fonte
Pra gente do futuro ... Eu li muitos artigos e blogs mas tive sorte com a solução abaixo ...
este blog descreve diferentes casos em que ocorre o erro "invalid_grant".
Aproveitar!!!
fonte
para mim, eu tive que ter certeza de que
redirect_uri
é uma correspondência exata para o console do desenvolvedorAuthorised redirect URIs
, que corrigiu para mim, fui capaz de depurar e saber qual era exatamente o problema depois de mudar dehttps://accounts.google.com/o/oauth2/token
parahttps://www.googleapis.com/oauth2/v4/token
Recebi um erro adequado:
fonte
Tive esse problema depois de habilitar uma nova API de serviço no console do Google e tentar usar as credenciais feitas anteriormente.
Para resolver o problema, tive que voltar à página da credencial, clicar no nome da credencial e clicar em "Salvar" novamente . Depois disso, eu poderia autenticar muito bem.
fonte
No meu caso, o problema estava no meu código. Por engano, tentei iniciar o cliente 2 vezes com os mesmos tokens. Se nenhuma das respostas acima ajudou, certifique-se de não gerar 2 instâncias do cliente.
Meu código antes da correção:
assim que eu mudar para (use apenas uma instância):
ele corrigiu meus problemas com o tipo de concessão.
fonte
Para mim, o problema era que eu tinha vários clientes em meu projeto e tenho quase certeza de que está tudo bem, mas eu apaguei todos os clientes desse projeto e criei um novo e todos começaram a trabalhar para mim (peguei esta ideia para a ajuda do plugin WP_SMTP fórum de suporte) Não consigo encontrar esse link para referência
fonte
Se você estiver limpando a entrada do usuário (por exemplo,
$_GET["code"]
em php), certifique-se de não substituir acidentalmente algo no código.A regex que estou usando agora é
/[^A-Za-z0-9\/-]/
fonte
Veja este https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988
Primeiro você precisa de um access_token:
Proteja o Token de Acesso e o Token de Atualização e o expire_in em um Banco de Dados. O token de acesso expira após $ expires_in segundos. Então você precisa pegar um novo token de acesso (e salvá-lo no banco de dados) com a seguinte solicitação:
Lembre-se de adicionar o domínio redirect_uri aos seus domínios no console do Google: https://console.cloud.google.com/apis/credentials na guia "OAuth 2.0-Client-IDs". Lá você encontra também seu Client-ID e Client-Secret.
fonte
Há um tempo limite não documentado entre o momento em que você redireciona o usuário pela primeira vez para a página de autenticação do Google (e recebe um código de volta) e o momento em que você pega o código retornado e o publica no url do token. Ele funciona bem para mim com o client_id real fornecido pelo Google, em vez de um "endereço de e-mail não documentado". Eu só precisava reiniciar o processo.
fonte
Se você está testando isso no postman / insomnia e está apenas tentando fazê-lo funcionar, dica: o código de autenticação do servidor (parâmetro de código) só é válido uma vez. Ou seja, se você colocar qualquer um dos outros parâmetros na solicitação e receber de volta um 400, você precisará usar um novo código de autenticação do servidor ou apenas obterá outro 400.
fonte