地理编码:typeError:在哈希之前必须对Unicode-Objects进行编码



在so中看到并回答了类似的问题,我的似乎没有掉入其中。

我正在遵循Google的指导。

Google中的示例已过时,因为urlparse不再存在Python 3,而是在Urllib.parse

因此,对下面的示例代码进行了轻微修改:

import urllib.parse

def sign_url(input_url=None, secret=None):
  """ Sign a request URL with a URL signing secret.
      Usage:
      from urlsigner import sign_url
      signed_url = sign_url(input_url=my_url, secret=SECRET)
      Args:
      input_url - The URL to sign
      secret    - Your URL signing secret
      Returns:
      The signed request URL
  """
  if not input_url or not secret:
    raise Exception("Both input_url and secret are required")
  url = urllib.parse.urlparse(input_url)
  # We only need to sign the path+query part of the string
  url_to_sign = url.path + "?" + url.query
  # Decode the private key into its binary format
  # We need to decode the URL-encoded private key
  decoded_key = base64.urlsafe_b64decode(secret)
  # Create a signature using the private key and the URL-encoded
  # string using HMAC SHA1. This signature will be binary.
  signature = hmac.new(decoded_key, url_to_sign, hashlib.sha1)
  # Encode the binary signature into base64 for use within a URL
  encoded_signature = base64.urlsafe_b64encode(signature.digest())
  original_url = url.scheme + "://" + url.netloc + url.path + "?" + url.query
  # Return signed URL
  return original_url + "&signature=" + encoded_signature

我在下面的signature = hmac.new(decoded_key, url_to_sign, hashlib.sha1)上收到错误:

typeError:unicode-objects必须在哈希

之前进行编码

如何修复它?非常感谢。

在函数修改如下后,它可以按预期工作:

def sign_url(input_url=None, secret=None):
  """ Sign a request URL with a URL signing secret.
      Usage:
      from urlsigner import sign_url
      signed_url = sign_url(input_url=my_url, secret=SECRET)
      Args:
      input_url - The URL to sign
      secret    - Your URL signing secret
      Returns:
      The signed request URL
  """
  if not input_url or not secret:
    raise Exception("Both input_url and secret are required")
  url = urllib.parse.urlparse(input_url)
  # We only need to sign the path+query part of the string
  url_to_sign = url.path + "?" + url.query
  # Decode the private key into its binary format
  # We need to decode the URL-encoded private key
  decoded_key = base64.urlsafe_b64decode(secret)
  # Create a signature using the private key and the URL-encoded
  # string using HMAC SHA1. This signature will be binary.
  signature = hmac.new(decoded_key, url_to_sign.encode('utf-8'), hashlib.sha1)
  # Encode the binary signature into base64 for use within a URL
  encoded_signature = base64.urlsafe_b64encode(signature.digest())
  original_url = url.scheme + "://" + url.netloc + url.path + "?" + url.query
  # Return signed URL
  return original_url + "&signature=" + encoded_signature.decode('ascii')

最新更新