Обновите токен доступа с помощью библиотеки Golang Oauth2

Я работаю в приложении Golang, это приложение подключено к службе Oauth2, прямо сейчас у меня есть токен обновления, и мне нужно получить с ним новый токен доступа, я использую golang.org/x/oauth2, но это не удалось, так что есть что-то что мне не хватает, в настоящее время у меня есть:

refresh_token := "some_refresh_token"

    var conf = oauth2.Config{
             ClientID:MY_CLIENT,
             ClientSecret:MY_CLIENT_SECRET,
             Scopes:[]string{"refresh_token"},
             RedirectURL:"https://mydomain/callback",
             Endpoint: oauth2.Endpoint{
                AuthURL:"myoauth2Cluster.com/oauth2/auth",
                TokenURL: "myoauth2Cluster.com/oauth2/token",
             },
    }

    t := new (oauth2.Token)
    t.RefreshToken=refresh_token

    myclient := conf.Client(context.Background(),t)

    req, err := http.NewRequest("GET",DontKnowWhichURLhere , nil)

    if err != nil {
        fmt.Println("error:",err.Error())
    }

    mrr, er := myclient.Do(req)

    if(er!=nil){
        fmt.Println(er.Error())
    }else{
        fmt.Println("status code:",mrr.StatusCode)
    }

Но я получаю статус 404, я проверил журналы сервера Oauth2, и у меня есть

msg="completed handling request" measure#https://myOauth2Cluster.latency=100648 method=GET remote=xxx.xxx.xx.xxx request="/" status=404 text_status="Not Found" took=100.648µs

Кроме того, я не совсем уверен, какой URL-адрес я должен установить при создании http.NewRequest, должен ли это быть обратный вызов? или URL-адрес сервера Oauth2?

Если бы был какой-то пример того, как обновить токен доступа с помощью этой библиотеки, было бы неплохо, но на данный момент я его не нашел.


person Sredny M Casanova    schedule 28.09.2017    source источник


Ответы (1)


Обычно вы просто используете свой старый токен, и он неявно обновляется библиотекой oauth2.

Пример:

В приведенном ниже коде conf равно *oauth2.Config.

Скажем, я обмениваю код на токен (первоначальная аутентификация):

token, err := conf.Exchange(ctx, code)
if err != nil {
    log.Fatalln(err)
}

SaveToken(token)

Теперь у меня есть токен, и я могу использовать его для запросов.

Позже, прежде чем я использую свой токен, я позволяю oauth2 автоматически обновлять его, если это необходимо:

tokenSource := conf.TokenSource(oauth2.NoContext, token)
newToken, err := tokenSource.Token()
if err != nil {
    log.Fatalln(err)
}

if newToken.AccessToken != token.AccessToken {
    SaveToken(newToken)
    log.Println("Saved new token:", newToken.AccessToken)
}

client := oauth2.NewClient(oauth2.NoContext, tokenSource)
resp, err := client.Get(url)
person hypnoglow    schedule 29.09.2017
comment
Я не знаю, почему этот ответ не помечен как правильный ответ, он полностью отвечает на него и по-прежнему точен в наши дни. - person Jay Cee; 16.10.2018
comment
Я также не знаю, почему этого нет в кратком руководстве, потому что это абсолютно необходимо. - person zimdanen; 29.04.2021