【问题标题】:How to generate the signed url in the server side using Python?如何使用 Python 在服务器端生成签名的 url?
【发布时间】:2014-07-10 16:04:45
【问题描述】:

我刚刚关注https://developers.google.com/storage/docs/accesscontrol?hl=zh-TW#Signed-URLs 使用 gsutil 生成签名的 url,它运行良好。

但我的问题是“如何在服务器端生成签名的 url?”

上面的云存储链接提到了一个示例项目https://github.com/GoogleCloudPlatform/storage-signedurls-python

它是否适合 App Engine 环境?如果是这样,私钥文件应该放在哪里?

或者有没有更好的方法来回答这个问题?

【问题讨论】:

    标签: python google-app-engine google-cloud-storage


    【解决方案1】:

    如果您使用的是 Python,则有一个示例 Python 应用程序可以生成名为 storage-signedurls-python 的签名 URL。

    【讨论】:

    • python 示例确实在我的本地环境中工作,但在 GoogleAppEngineLauncher 和在线运行时出现问题。我猜这是因为 Launcher 和在线 App Engine 没有“PyCrypto”和“requests”。我什至尝试在我的项目文件夹中制作“Crypto”,但它也不起作用。
    【解决方案2】:

    我们是这样做的:

    第 1 步:获取 p12 文件/证书

    https://console.developers.google.com/下载p12文件 “APIs & auth / Credentials”标签。

    第 2 步:将 p12 文件转换为 DER 格式

    找到一台打开并使用终端连接的 Linux 计算机 命令:

    openssl pkcs12 -in <filename.p12> -nodes -nocerts > <filename.pem>
    # The current Google password for the p12 file is `notasecret`
    
    openssl rsa -in <filename.pem> -inform PEM -out <filename.der> -outform DER
    

    第 3 步:将 DER 文件转换为 base64 编码字符串

    Python 控制台:

    private_key = open(‘<filename.der>’, 'rb').read()
    print private_key.encode('base64')
    

    复制并粘贴到应用引擎脚本中。

    第 4 步:在 AppEngine 中启用 PyCrypto

    app.yaml 必须有一行才能启用 PyCrypto:

    - name: pycrypto
      version: latest
    

    第 5 步:创建签名 URL 的 Python 代码

    import Crypto.Hash.SHA256 as SHA256
    import Crypto.PublicKey.RSA as RSA
    import Crypto.Signature.PKCS1_v1_5 as PKCS1_v1_5
    
    der_key = “””<copy-paste-the-base64-converted-key>”””.decode('base64')
    
    bucket = <your cloud storage bucket name (default is same as app id)>
    filename = <path + filename>
    
    valid_seconds = 5
    expiration = int(time.time() + valid_seconds)
    
    signature_string = 'GET\n\n\n%s\n' % expiration
    signature_string += bucket + filename
    
    
    
    # Sign the string with the RSA key.
    signature = ''
    try:
      start_key_time = datetime.datetime.utcnow()
      rsa_key = RSA.importKey(der_key, passphrase='notasecret')
      #objects['rsa_key'] = rsa_key.exportKey('PEM').encode('base64')
      signer = PKCS1_v1_5.new(rsa_key)
      signature_hash = SHA256.new(signature_string)
      signature_bytes = signer.sign(signature_hash)
      signature = signature_bytes.encode('base64')
    
      objects['sig'] = signature
    except:
      objects['PEM_error'] = traceback.format_exc()
    
    try:
      # Storage
      STORAGE_CLIENT_EMAIL = <Client Email from Credentials console: Service Account Email Address>
      STORAGE_API_ENDPOINT = 'https://storage.googleapis.com'
    
      # Set the query parameters.
      query_params = {'GoogleAccessId': STORAGE_CLIENT_EMAIL,
                    'Expires': str(expiration),
                    'Signature': signature}
    
    
      # This is the signed URL:
      download_href = STORAGE_API_ENDPOINT + bucket + filename + '?' + urllib.urlencode(query_params)
    
    except:
      pass
    

    来源

    How to get the p12 file.

    Signing instructions.

    Inspiration for how to sign the url.

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 2011-02-09
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多