2015-03-30 16 views
0

嘿即時嘗試實現可恢復上傳到雲存儲。Golang谷歌存儲可恢復上傳HTTP 401

但即時得到一個狀態:「401未授權」的StatusCode:401

和IM假設它了與承載的東西,但我想不出另一種方式將承載令牌。

我已經能夠使用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

我不確定是否「從用戶請求解析承載」意味着您正在運行Web服務器並且您想訪問用戶的Google Cloud Storage帳戶。如果是這樣,您可能需要熟悉:https://developers.google.com/accounts/docs/OAuth2WebServer – rein

回答

0

我有類似的困難,不確定您的情況是否與我的情況相同。我的目標是

  1. 用戶客戶端上傳元數據到我的服務器在DB
  2. 服務器認證和商店
  3. 服務器要求谷歌雲存儲爲resumabale upload url
  4. Server返回URL客戶
  5. 客戶端使用網址上傳媒體到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功能已經能夠上傳文件。