首页 文章

Golang谷歌存储可恢复上传HTTP 401

提问于
浏览
0

嘿我试图实现可恢复上传到 Cloud 存储 .

但我得到一个 Status:"401 Unauthorized", StatusCode:401

我假设它与持有人有关,但我无法找出另一种方式来发送持有人令牌 .

我已经能够使用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)

1 回答

  • 0

    我遇到了类似的困难,不确定你的情况是否与我的相同 . 我的目标是

    • 用户客户端将元数据上传到我的服务器

    • 服务器在DB中进行身份验证和存储

    • 服务器要求Google Cloud 端存储 resumabale upload url

    • 服务器将url返回给客户端

    • 客户端使用url将媒体上传到GCS

    我'm getting 401 unauthorized returns too. Maybe I'我没有正确设置 Headers ?或者 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 功能 .

相关问题