18

Google Cloud Storageの通常の署名付き URL (クエリ文字列認証)を処理するのはイライラします。

Google Cloud Storage の署名付き URL の例-> Google Cloud Storage の署名付き URL を生成するためにインターネット全体で利用できるコードはこれだけですか? すべてを読んで、必要に応じて Pure Python GAE 用に手動で調整する必要がありますか?

すでにSDKに含まれているAWS S3 getAuthenticatedURL()と比較するとばかげています...

私は明らかな何かを見逃していますか、それとも誰もが同じ問題に直面していますか? どうしたんだ?

4

5 に答える 5

5

Goでそれを行う方法は次のとおりです。

func GenerateSignedURLs(c appengine.Context, host, resource string, expiry time.Time, httpVerb, contentMD5, contentType string) (string, error) {
    sa, err := appengine.ServiceAccount(c)
    if err != nil {
        return "", err
    }
    expUnix := expiry.Unix()
    expStr := strconv.FormatInt(expUnix, 10)
    sl := []string{
        httpVerb,
        contentMD5,
        contentType,
        expStr,
        resource,
    }
    unsigned := strings.Join(sl, "\n")
    _, b, err := appengine.SignBytes(c, []byte(unsigned))
    if err != nil {
        return "", err
    }
    sig := base64.StdEncoding.EncodeToString(b)
    p := url.Values{
        "GoogleAccessId": {sa},
        "Expires": {expStr},
        "Signature": {sig},
    }
    return fmt.Sprintf("%s%s?%s", host, resource, p.Encode()), err
}
于 2014-10-26T23:26:59.893 に答える
4

なぜドキュメントがそんなに悪いのかわかりません。SOに関する他の唯一の包括的な答えは素晴らしいですが退屈です。

generate_signed_url メソッドに入ります。うさぎの穴を掘り下げると、このメソッドを使用した場合のコード パスが、GAE で実行した場合の上記の SO 投稿のソリューションと同じであることがわかります。ただし、この方法は面倒ではなく、他の環境をサポートしており、エラー メッセージも優れています。

コード内:

def sign_url(obj, expires_after_seconds=60):

    client = storage.Client()
    default_bucket = '%s.appspot.com' % app_identity.get_application_id()
    bucket = client.get_bucket(default_bucket)
    blob = storage.Blob(obj, bucket)

    expiration_time = int(time.time() + expires_after_seconds)

    url = blob.generate_signed_url(expiration_time)

    return url
于 2017-07-03T22:28:51.567 に答える