Нет токена обновления от Google OAuth2

Кажется, я не могу получить токен обновления из 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")

и это тоже похоже не работает

Обновлено: добавить фрагменты кода.

Инициируем поток OAuth:

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
}

Обратный вызов OAuth

func TestOauthCallback(ctx context.Context, c *app.RequestContext) {
    var err error
    var req register.OauthCallbackReq

    // ...

    queryArgs := &register.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
}

Редактировать 2

Кажется, вы должны предоставить аргументы oauth2.AccessTypeOffline и oauth2.ApprovalForce в AuthCodeURL(), а не при запросе токена доступа 🤡

вы создали веб-приложение или установленное приложение?

Linda Lawton - DaImTo 29.04.2024 08:07

@LindaLawton-DaImTo Это веб-приложение

Mono 29.04.2024 08:23

Сделайте мне одолжение, зайдите в учетную запись пользователей Google в разделе «Подключения» проверьте наличие вашего приложения, если его там нет, сообщите мне. если он удален, попробуйте еще раз и сообщите мне, получите ли вы токен обновления.

Linda Lawton - DaImTo 29.04.2024 08:24

@LindaLawton-DaImTo Да, я удалял приложение несколько раз, и даже при первом предоставлении разрешения оно не возвращает токен обновления

Mono 29.04.2024 08:31

@LindaLawton-DaImTo Я добавил несколько фрагментов кода. Полученный здесь токен не содержитrefresh_token.

Mono 29.04.2024 09:40

получаете ли вы обратно токен доступа, который можно использовать? — это код, применяемый к телу.

Linda Lawton - DaImTo 29.04.2024 09:51
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
7
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы должны предоставить аргументы oauth2.AccessTypeOffline и oauth2.ApprovalForce в AuthCodeURL() при запуске процесса OAuth, а не при запросе токена доступа 🤡

url := googleproject.OauthConfig.AuthCodeURL(oauthState, oauth2.ApprovalForce, oauth2.AccessTypeOffline)

@LindaLawton-DaImTo Спасибо за пример.

Другие вопросы по теме