我似乎无法从 oauth2.Exchange() 获取正在测试的应用程序的刷新令牌。
config.Exchange(ctx, code, oauth2.AccessTypeOffline, oauth2.ApprovalForce)
返回没有refresh_token的访问令牌。更烦人的是,由于某种原因,
oauth2.ApprovalForce
不会提示OAuth同意屏幕。它仅在第一次提示,并且即使在第一次同意后,也不会返回刷新令牌。
通过调试器检查请求,请求正文中发送以下内容:
access_type=offline&client_id=...&client_secret=...&grant_type=authorization_code&prompt=consent&redirect_uri=...
所以图书馆应该运转良好。我添加了自定义选项
SetAuthURLParam("approval_prompt", "force")
这似乎也不起作用
func TestRegister(ctx context.Context, c *app.RequestContext) {
var err error
var req register.RegisterReq
// ...
var oauthState string
if oauthState, err = getOAuthState(c); err != nil {
c.JSON(400, map[string]any{"Error": err.Error()})
return
}
url := config.AuthCodeURL(oauthState)
c.Redirect(http.StatusTemporaryRedirect, []byte(url))
return
}
func getOAuthState(c *app.RequestContext) (string, error) {
expiration := 60 * 60 * 24
cookieName := "authstate"
b := make([]byte, 16)
var err error
if _, err = rand.Read(b); err != nil {
return "", err
}
state := base64.URLEncoding.EncodeToString(b)
c.SetCookie(cookieName, state, expiration, "/", "localhost", protocol.CookieSameSiteLaxMode, false, false)
return state, nil
}
func TestOauthCallback(ctx context.Context, c *app.RequestContext) {
var err error
var req register.OauthCallbackReq
// ...
queryArgs := ®ister.OauthCallbackReq{}
if err = c.BindQuery(queryArgs); err != nil {
c.JSON(500, map[string]any{"Error": err.Error()})
return
}
var token *oauth2.Token
if token, err = oauthAuthorize(ctx, queryArgs); err != nil {
c.JSON(500, map[string]any{"Error": err.Error()})
return
}
_ = token
// ...
}
func oauthAuthorize(ctx context.Context, queryArgs *register.OauthCallbackReq) (*oauth2.Token, error) {
var token *oauth2.Token
var err error
if token, err = config.Exchange(ctx, code, oauth2.AccessTypeOffline, oauth2.ApprovalForce); err != nil {
return nil, err
}
return token, err
}
看来您应该在 AuthCodeURL() 中提供
oauth2.AccessTypeOffline
和 oauth2.ApprovalForce
参数,而不是在请求访问令牌时提供 🤡
您似乎应该在启动 OAuth 进程时而不是在请求访问令牌时在 AuthCodeURL() 中提供 oauth2.AccessTypeOffline 和 oauth2.ApprovalForce 参数🤡
url := googleproject.OauthConfig.AuthCodeURL(oauthState, oauth2.ApprovalForce, oauth2.AccessTypeOffline)
@LindaLawton-DaImTo 感谢您提供的示例