Golang Google Drive Oauth2 不返回刷新令牌

huangapple go评论62阅读模式
英文:

Golang Google Drive Oauth2 Not Returning Refresh Token

问题

我能够通过OAuth过程获取令牌,并成功地用于与GDrive进行交互。该令牌具有AccessToken但没有RefreshToken。如何获取RefreshToken?

这是一个Web服务。以下是启动OAuth授权过程的代码:

// 设置配置。
oauthconfig := &oauth2.Config{
ClientID: XXX,
ClientSecret: XXX,
RedirectURL: "https://MYDOMAIN/gdrivecb",
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/drive"},
Endpoint: oauth2.Endpoint{
AuthURL: "https://accounts.google.com/o/oauth2/auth",
TokenURL: "https://accounts.google.com/o/oauth2/token",
},
}
url := oauthconfig.AuthCodeURL(MYSCOPEDATA, oauth2.AccessTypeOffline)
http.Redirect(w, r, url, http.StatusFound)

以下是在调用/gdrivecb时调用的相关代码(oauthconfig与之前相同,code是code URL参数):

token, err = oauthconfig.Exchange(nil, code)

该令牌包含AccessToken但没有RefreshToken。它在一个小时内有效(Expiry的长度),然后在此之后停止工作。

英文:

I am able to go through the oauth procedure to get a token which I'm able to successfully use to to interact with GDrive. The token has an AccessToken but no RefreshToken. How do I get a RefreshToken?

This is in a web service. Here's the code that initiates the oauth authorization procedure:

// Set up a configuration.
oauthconfig := &oauth2.Config{
	ClientID:     XXX,
	ClientSecret: XXX,
	RedirectURL:  "https://MYDOMAIN/gdrivecb",
	Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/drive"},
	Endpoint: oauth2.Endpoint{
		AuthURL:  "https://accounts.google.com/o/oauth2/auth",
		TokenURL: "https://accounts.google.com/o/oauth2/token",
	},
}
url := oauthconfig.AuthCodeURL(MYSCOPEDATA, oauth2.AccessTypeOffline)
http.Redirect(w, r, url, http.StatusFound)

Here's the relevant code that's called when /gdrivecb is called (oauthconfig is the same as before, code is the code URL parameter:

token, err = oauthconfig.Exchange(nil, code)

That token contains an AccessToken but no RefreshToken. And it works for an hour (the length of Expiry), but then stops working after that.

答案1

得分: 2

问题不在于代码,如果您之前从未进行过授权过程,代码是可以正常工作的。问题出现在第二次进行授权过程时。您将不会看到要求的权限,并且不会发送刷新令牌。您必须强制再次显示权限对话框。为此,请将approval_prompt=force添加到重定向URL中。

英文:

The problem was not with the code, and the code works if you've never gone through the authorization process before. The problem occurs if you go through the authorization process a second time. You are not shown the privileges being asked for, and a refresh token is not sent. You must force the privileges dialog to be shown again. To do so, add approval_prompt=force to the redirect URL.

huangapple
  • 本文由 发表于 2017年3月10日 07:58:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/42707791.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定