Как получить токен доступа для использования с URL хранилища Google - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь прочитать из этого хранилища Google:

https://storage.googleapis.com/images.eng.channelmeter.com/avatars/d2d48e49-82be-4cf6-be6e-11ada43c7339

Но я получаю эту ошибку:

nice colorful error image

ошибка примерно такая:

<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>
Anonymous caller does not have storage.objects.get access to images.eng.channelmeter.com/avatars/d2d48e49-82be-4cf6-be6e-11ada43c7339.
</Details>
</Error>

Как получить токен доступа, который я могу добавить в URL? Примерно так:

https://storage.googleapis.com/images.eng.channelmeter.com/avatars/d2d48e49-82be-4cf6-be6e-11ada43c7339?access_token= "XXX"

Я предполагаю, что могу сделать некоторый вызов, используя библиотеку OAuth для получения токена временного / одноразового доступа, Кто-нибудь знает, как?

Обновление : я могу получить AccessToken, используя эту технику: https://tanaikech.github.io/2018/12/11/retrieving-access-token-using-service-account-by-googles-oauth2-package-for-golang/

, но потом, когда я добавляю ?access_token=xxx к URL, я теперь просто получаю:

<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
</Error>

блин.

1 Ответ

1 голос
/ 14 апреля 2020

Я воспроизвел ваш вариант использования. Предполагая, что у вас есть key.json файл учетной записи службы с правами доступа wright в корзине.

Чтобы авторизовать запросы из командной строки или для тестирования, вы можете использовать команду curl со следующим синтаксисом :

curl -H "Авторизация: Bearer ACCESS_TOKEN" "https://storage.googleapis.com/storage/v1/b/example-bucket/o"

Для локального тестирования можно использовать команду gcloud auth application-default print-access-token для создания токена.

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
    "net/http"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "golang.org/x/oauth2/jwt"
    "log"
)


func serviceAccount(credentialFile string) (*oauth2.Token, error) {
    b, err := ioutil.ReadFile(credentialFile)
    if err != nil {
        return nil, err
    }
    var c = struct {
        Email      string `json:"client_email"`
        PrivateKey string `json:"private_key"`
    }{}
    json.Unmarshal(b, &c)
    config := &jwt.Config{
        Email:      c.Email,
        PrivateKey: []byte(c.PrivateKey),
        Scopes: []string{
            "https://www.googleapis.com/auth/cloud-platform",
        },
        TokenURL: google.JWTTokenURL,
    }
    token, err := config.TokenSource(oauth2.NoContext).Token()
    if err != nil {
        return nil, err
    }
    return token, nil
}

func main() {
    token, err := serviceAccount("key.json") // Please set here
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }


    url := "https://storage.googleapis.com/storage/v1/b/your-bucket/o/your-file?alt=media"

    // Create a Bearer string by appending string access token
    var bearer = "Bearer " + token.AccessToken

    // Create a new request using http
    req, err := http.NewRequest("GET", url, nil)

    // add authorization header to the req

    req.Header.Add("Authorization", bearer)

    // Send req using http Client
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Println("Error on response.\n[ERRO] -", err)
    }

    body, _ := ioutil.ReadAll(resp.Body)
    log.Println(string([]byte(body)))

}

...