2017-10-16 1 views
0

샘플 URL을 생성하기 위해 제공된 공간에 URL과 서명을 넣으면 Google과 다른 서명이 나옵니다. 나는 멍청한 실수가 없다고 생각하고 다시 확인했다. 어쩌면 내가 잘못 이해했거나 파이썬 코드에서 뭔가 잘못 번역 한 것일까 요?Google API 문서 페이지에서 생성 된 서명과 일치 할 수 없습니다.

내 코드 :

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 

구글 페이지 https://developers.google.com/maps/documentation/static-maps/get-api-key?hl=en_US#sample-code-for-url-signing

과 제공 파이썬 예 : 파이썬 버전

#!/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) 

답변

0

urlparse.urlparse(input_url).path/ 시작합니다. 루비 버전에서는 상대 경로 path = "maps/api/staticmap?key=#{key}&size=450x300"을 사용합니다.

관련 문제