Кажется, я не могу получить токен обновления из oauth2.Exchange() для тестируемого приложения.
config.Exchange(ctx, code, oauth2.AccessTypeOffline, oauth2.ApprovalForce)
возвращает токен доступа без обновления_токена. Что еще более раздражает, так это то, что 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
}
Кажется, вы должны предоставить аргументы oauth2.AccessTypeOffline и oauth2.ApprovalForce в AuthCodeURL(), а не при запросе токена доступа 🤡
@LindaLawton-DaImTo Это веб-приложение
Сделайте мне одолжение, зайдите в учетную запись пользователей Google в разделе «Подключения» проверьте наличие вашего приложения, если его там нет, сообщите мне. если он удален, попробуйте еще раз и сообщите мне, получите ли вы токен обновления.
@LindaLawton-DaImTo Да, я удалял приложение несколько раз, и даже при первом предоставлении разрешения оно не возвращает токен обновления
@LindaLawton-DaImTo Я добавил несколько фрагментов кода. Полученный здесь токен не содержитrefresh_token.
получаете ли вы обратно токен доступа, который можно использовать? — это код, применяемый к телу.

Кажется, вы должны предоставить аргументы oauth2.AccessTypeOffline и oauth2.ApprovalForce в AuthCodeURL() при запуске процесса OAuth, а не при запросе токена доступа 🤡
url := googleproject.OauthConfig.AuthCodeURL(oauthState, oauth2.ApprovalForce, oauth2.AccessTypeOffline)
@LindaLawton-DaImTo Спасибо за пример.
вы создали веб-приложение или установленное приложение?