2015-03-30 2 views
0

Привет, я пытаюсь реализовать возобновляемую загрузку в облачное хранилище.Golang google storage возобновляемая загрузка HTTP 401

Но им получить статус: «401 Несанкционированное», StatusCode: 401

И им при условии, что `s что-то с носителем, но я не могу понять другой способ отправить носителя маркера.

Я смог удалить файлы с помощью метода GetClinet.

func GetClinet(c endpoints.Context) *http.Client { 
    cli := &http.Client{ 
     Transport: &oauth2.Transport{ 
      Source: google.AppEngineTokenSource(c, storage.ScopeReadWrite), 
      Base: &urlfetch.Transport{Context: c}, 
     }, 
    } 

    return cli 

} 

client := GetClinet(con) 

url := "https://storage.googleapis.com/bucketName/file.txt" 
b := r.Header.Get("Authorization") //parse the bearer from user request 
r, err = http.NewRequest("POST", url, nil) 
r.Header.Add("Content-Type", "text/plain") 
r.Header.Add("Content-Length", "0") 
r.Header.Add("x-goog-resumable", "start") 
r.Header.Add("Authorization", b) 

resp, err := client.Do(r) 
+0

Я не уверен, что если «разобрать предъявителя по запросу пользователя» означает, что вы используете веб-сервер и хотите получить доступ к учетной записи Google Cloud Storage пользователя. Если это так, вы можете ознакомиться с: https://developers.google.com/accounts/docs/OAuth2WebServer – rein

ответ

0

У меня схожие трудности, не уверен, что ваша ситуация такая же, как у меня. Моя цель состоит в том, чтобы

  1. клиент Пользователь загружает мета-данные к моему серверу
  2. проверяет подлинность сервера и сохраняет в БД
  3. сервер запрашивает Google Cloud Storage для resumabale upload url
  4. сервер возвращает URL для клиента
  5. Client использует url для загрузки носителя в GCS

Я получаю 401 несанкционированных возвращения тоже. Может быть, я неправильно настраиваю заголовки? или storage.SignedURL не обрабатывает возобновляемые загрузки правильно ...?

Я был в состоянии загрузить файлы с помощью файла учетной записи службы PEM

func setGcsFile(c context.Context, fileId string, content []byte) error { 
    expiration := time.Now().Add(time.Second * 30) //expire in 30 seconds 

    data, err = ioutil.ReadFile(serviceAccountPEMFilename) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     panic(err) 
    } 

    log.Debugf(c, "Getting upload url") 
    opts := &storage.SignedURLOptions{ 
     GoogleAccessID: googleAccessID, 
     PrivateKey:  data, 
     Method:   "PUT", 
     Expires:  expiration, 
    } 

    putURL, err := storage.SignedURL(bucket, fileId, opts) 
    if err != nil { 
     log.Debugf(c, "%v", err) 
     return err 
    } 

    log.Debugf(c, "PUT URL : %v\n", putURL) 

    client := urlfetch.Client(c) 
    req, err := http.NewRequest("PUT", putURL, bytes.NewBuffer(content)) 
    res, err := client.Do(req) 
    if err != nil { 
     log.Debugf(c, "%v", err) 
     return err 
    } 
    res.Body.Close() 
    log.Debugf(c, "Response Code: %s\n", res.Status) 
    return nil 
} 

Я думаю о вытягивать и модификацию функции storage.SignedURL рядом.

Смежные вопросы