Quero obter o token de acesso do Google. A API do Google diz que, para obter o token de acesso, envie o código e outros parâmetros para a página de geração de token, e a resposta será um objeto JSON como:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
No entanto, não estou recebendo o token de atualização. A resposta no meu caso é:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
fonte
fonte
Respostas:
O
refresh_token
é fornecido apenas na primeira autorização do usuário. As autorizações subsequentes, como as que você faz ao testar uma integração OAuth2, não retornarãorefresh_token
novamente. :)refresh_token
(desde que também inclua o parâmetro de consulta 'access_type = offline').Como alternativa, você pode adicionar os parâmetros de consulta
prompt=consent&access_type=offline
ao redirecionamento do OAuth (consulte a página do Google OAuth 2.0 para aplicativos de servidor da Web ).Isso solicitará que o usuário autorize o aplicativo novamente e sempre retornará a
refresh_token
.fonte
access_type=offline
em todos os casos quando quiserrefresh_token
.$client->setAccessType('offline')
. Ofunction setApprovalPrompt()
já é passadoforce
, por padrão.Para obter o token de atualização, é necessário adicionar ambos
approval_prompt=force
e,access_type="offline"
se você estiver usando o cliente java fornecido pelo Google, terá a seguinte aparência:fonte
Eu procurei uma longa noite e isso está fazendo o truque:
User-example.php modificado de admin-sdk
você obtém o código no URL de redirecionamento e a autenticação com o código e obtém o token de atualização
Você deve armazená-lo agora;)
Quando a sua tecla de acesso expira, basta
fonte
Isso me causou alguma confusão, então pensei em compartilhar o que aprendi da maneira mais difícil:
Ao solicitar acesso usando os parâmetros
access_type=offline
e,approval_prompt=force
você deve receber um token de acesso e um token de atualização . O token de acesso expira logo após o recebimento e você precisará atualizá-lo.Você fez corretamente a solicitação para obter um novo token de acesso e recebeu a resposta que possui seu novo token de acesso . Também fiquei confuso pelo fato de não ter recebido um novo token de atualização . No entanto, é assim que deve ser, pois você pode usar o mesmo token de atualização repetidamente.
Acho que algumas das outras respostas presumem que você deseje obter um novo token de atualização por algum motivo e sugeriu que você re-autorize o usuário, mas, na verdade, você não precisa, pois o token de atualização que você possui funcionará até revogado pelo usuário.
fonte
A resposta de Rich Sutton finalmente funcionou para mim, depois que percebi que a adição
access_type=offline
é feita na solicitação de um código de autorização do cliente front-end , não na solicitação de back-end que troca esse código por um access_token. Adicionei um comentário à resposta dele e este link no Google para obter mais informações sobre como atualizar tokens.PS Se você estiver usando o Satellizer, veja como adicionar essa opção ao $ authProvider.google no AngularJS .
fonte
Para obter o que
refresh_token
você precisa, incluaaccess_type=offline
no URL de solicitação do OAuth. Quando um usuário se autentica pela primeira vez, você recupera um valor nulorefresh_token
e um valoraccess_token
expirado.Se você tiver uma situação em que um usuário possa autenticar novamente uma conta para a qual já possui um token de autenticação (como o @SsjCosty mencionou acima), será necessário recuperar informações do Google em que conta o token é. Para fazer isso, adicione
profile
aos seus escopos. Usando a gema OAuth2 Ruby, sua solicitação final pode ser algo como isto:Observe que o escopo possui duas entradas delimitadas por espaço, uma para acesso somente leitura ao Google Analytics e a outra é justa
profile
, que é um padrão do OpenID Connect.Isso fará com que o Google forneça um atributo adicional chamado
id_token
naget_token
resposta. Para obter informações sobre o id_token, confira esta página nos documentos do Google. Existem várias bibliotecas fornecidas pelo Google que validam e decodificam isso para você (usei a gema do Ruby google-id-token ). Depois de analisado, osub
parâmetro é efetivamente o ID exclusivo da conta do Google.Vale ressaltar que, se você alterar o escopo, receberá novamente um token de atualização para usuários que já se autenticaram com o escopo original. Isso é útil se, por exemplo, você já tiver vários usuários e não quiser fazer com que todos cancelem a autenticação do aplicativo no Google.
Ah, e uma observação final: você não precisa
prompt=select_account
, mas é útil se você tiver uma situação em que seus usuários possam querer se autenticar com mais de uma conta do Google (por exemplo, você não está usando isso para fazer login / autenticação) .fonte
1. Como obter o 'refresh_token'?
Solução: a opção access_type = 'offline' deve ser usada ao gerar authURL. fonte: usando o OAuth 2.0 para aplicativos de servidor Web
2. Mas mesmo com 'access_type = offline', não estou recebendo o 'refresh_token'?
Solução: observe que você o obterá apenas na primeira solicitação; portanto, se você o estiver armazenando em algum lugar e houver uma disposição para substituí-lo no seu código ao obter novo access_token após a expiração anterior, certifique-se de não substituir esse valor.
Do documento de autenticação do Google: (este valor = access_type)
Se você precisar de 'refresh_token' novamente, precisará remover o acesso ao seu aplicativo, seguindo as etapas escritas na resposta de Rich Sutton .
fonte
Definir isso fará com que o token de atualização seja enviado sempre:
Um exemplo é dado abaixo (php):
fonte
Para mim, eu estava testando o
CalendarSampleServlet
Google. Após 1 hora, o access_key expira e há um redirecionamento para uma página 401. Eu tentei todas as opções acima, mas elas não funcionaram. Finalmente, ao verificar o código-fonte para 'AbstractAuthorizationCodeServlet' , pude ver que o redirecionamento seria desativado se credenciais estivessem presentes, mas, idealmente, ele deveria ter verificadorefresh token!=null
. Eu adicionei o código abaixoCalendarSampleServlet
e funcionou depois disso. Grande alívio depois de tantas horas de frustração. Graças a Deus.fonte
agora o google recusou esses parâmetros no meu pedido (access_type, prompt) ... :( e não existe o botão "Revogar acesso". Estou frustrado por ter voltado meu refresh_token lol
ATUALIZAÇÃO: Encontrei a resposta aqui: D você pode recuperar o token de atualização mediante uma solicitação https://developers.google.com/identity/protocols/OAuth2WebServer
fonte
fonte
Usando o acesso offline e o prompt: o consentimento funcionou bem para mim:
fonte
Minha solução foi um pouco estranha .. eu tentei todas as soluções que encontrei na internet e nada. Surpreendentemente, isso funcionou: exclua as credenciaiss.json, atualize, vincule seu aplicativo à sua conta novamente. O novo arquivo credentials.json terá o token de atualização. Faça backup desse arquivo em algum lugar. Continue usando seu aplicativo até que o erro de atualização do token volte novamente. Exclua o arquivo crendetials.json que agora está apenas com uma mensagem de erro (isso aconteceu no meu caso) e cole o arquivo de credenciais antigo na pasta, pronto! Já faz uma semana desde que fiz isso e não tive mais problemas.
fonte
Para obter novos refresh_token a cada vez na autenticação, o tipo de credenciais do OAuth 2.0 criadas no painel deve ser "Outro". Também conforme mencionado acima, a opção access_type = 'offline' deve ser usada ao gerar o authURL.
Ao usar credenciais com o tipo "Aplicativo da Web", nenhuma combinação de variáveis de prompt / aprovação_prompt funcionará - você ainda obterá o refresh_token somente na primeira solicitação.
fonte