2017-10-16 4 views
0

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) 

Répondre

0

urlparse.urlparse(input_url).path en version python commence par /. En version ruby, vous utilisez un chemin relatif path = "maps/api/staticmap?key=#{key}&size=450x300".