Lorsque je place mon URL et ma signature dans l'espace prévu pour générer un exemple d'URL signée, ma signature diffère de celle de Google. J'ai vérifié et revérifié donc je ne pense pas qu'il y ait des erreurs stupides. Alors peut-être que j'ai mal compris quelque chose ou que j'ai traduit quelque chose du code Python?Impossible de faire correspondre la signature générée par la page de documentation de l'API Google
mon code:
def my_map_url
domain = "http://maps.googleapis.com/"
key = Figaro.env.maps_browser_api_key
path = "maps/api/staticmap?key=#{key}&size=450x300"
object.each do |location|
path += "&markers=#{location.latitude}%2C#{location.longitude}"
end
puts domain + path # What I put into Google's url input box
domain + path + "&signature=#{hmac_sha1(path)}"
end
def hmac_sha1(data)
digest = OpenSSL::Digest.new('sha1')
secret = Base64.urlsafe_decode64(ENV["MAPS_STATIC_SECRET"])
hmac = OpenSSL::HMAC.digest(digest, secret, data)
return Base64.urlsafe_encode64(hmac)
end
La page Google https://developers.google.com/maps/documentation/static-maps/get-api-key?hl=en_US#sample-code-for-url-signing
et leur exemple fourni Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
""" Signs a URL using a URL signing secret """
import hashlib
import hmac
import base64
import urlparse
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 = urlparse.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
if __name__ == "__main__":
input_url = raw_input("URL to Sign: ")
secret = raw_input("URL signing secret: ")
print "Signed URL: " + sign_url(input_url, secret)