2017-11-06 10 views
0

vuforiaのAPIからターゲットを取得しようとしていますが、コード化されたデータである「Authorization」ヘッダーの最後の値を渡すことはできません。UnicodeオブジェクトはPython 3.6をハッシングする前にエンコードする必要があります。Vuforia

のUnicode-オブジェクトは、これは、コードのトライ抜粋である

をハッシュする前に符号化されなければならない、私はvuforia's documentationを以下だが、それでも、何かが私のコードと私ドンと間違っている:私はこれで取得していますそれが何であるかの手がかりを持っている

import base64 
import hashlib 
import hmac 

import requests 
from flask import Flask, request 
from email.utils import formatdate 
import logging 

app = Flask(__name__) 


@app.route('/') 
def hello_world(): 
    try: 
     import http.client as http_client 
    except ImportError: 
     # Python 2 
     import httplib as http_client 
    http_client.HTTPConnection.debuglevel = 1 

    logging.basicConfig() 
    logging.getLogger().setLevel(logging.DEBUG) 
    requests_log = logging.getLogger("requests.packages.urllib3") 
    requests_log.setLevel(logging.DEBUG) 
    requests_log.propagate = True 

    url = 'https://vws.vuforia.com/targets' 
    req = requests.Request('GET', url) 
    req.headers = setHeaders(req) 
    resp = requests.Session().send(req.prepare()) 

    return resp.text 


def compute_md5_hex(data): 
    """Return the hex MD5 of the data""" 
    h = hashlib.md5() 
    h.update(data) 
    return h.hexdigest() 


def compute_hmac_base64(key, data): 
    """Return the Base64 encoded HMAC-SHA1 using the provide key""" 
    h = hmac.new(key, None, hashlib.sha1) 
    h.update(data) 
    return base64.b64encode(h.digest()) 


def setHeaders(request): 
    date = formatdate(None, localtime=False, usegmt=True) 
    accessKey = "ce1500fhfth429279173fd839f9d414532014a3da" 
    secret_key = b"5d3fdawd7211447c35be607ae5a08ec794a09d71d" 
    headers = {'Date': date, 'Authorization': "VWS " + accessKey + ":" + tmsSignature(request, secret_key)} 

    return headers 


def tmsSignature(request, secretKey): 
    method = request.method 
    contentType = "" 
    hexDigest = "d41d8cd98f00b204e9800998ecf8427e" 
    if method == "GET" or method == "POST": 
     pass 
     # Do nothing because the strings are already set correctly 
    elif method == "POST" or method == "PUT": 
     contentType = "application/json" 
     # If this is a POST or PUT the request should have a request body 
     hexDigest = compute_md5_hex(request) 
    else: 
     print("ERROR: Invalid content type passed to Sig Builder") 

    # Date in the header and date used to calculate the hash must be the same 
    dateValue = formatdate(None, localtime=False, usegmt=True) 
    requestPath = str(request.url) 
    components_to_sign = list() 
    components_to_sign.append(method) 
    components_to_sign.append(str(hexDigest)) 
    components_to_sign.append(str(contentType)) 
    components_to_sign.append(str(dateValue)) 
    components_to_sign.append(str(requestPath)) 
    string_to_sign = "\n".join(components_to_sign) 
    shaHashed = "" 
    try: 
     shaHashed = compute_hmac_base64(secretKey, string_to_sign) 
    except Exception as e: 
     print("ERROR ", e) 
    return shaHashed 


if __name__ == '__main__': 
    app.run() 

答えて

1

hmacライブラリからupdate機能があり、その代わりに、文字列/ユニコードのバイト(参照hmacのドキュメントをチェックアウトするように入力を必要とするので、

h.update(data) 

:ウルhmac_base64_key関数は、この特定の呼び出しが原因でありますそのupdate署名の場合はhashlibになります)。

修正は単純であるようなので、それはそうです:あなたがsetHeadersに文字列でそれを連結しているので、あなたは再び文字列にcompute_hmac_base64shaHashed)の戻り値を変更する必要があります

h.update(data.encode("utf8")) # or other encoding you want to use 

注意。

(このPython 3をタグ付けしているので、あなたのコードにPython 2のチェックがあっても、私はPython 3のコードを仮定しています)。

+0

それはありがとう – AND4011002849

関連する問題