2017-06-05 1 views
0

Ich versuche mit Duos Python-Client zu arbeiten (https://github.com/duosecurity/duo_client_python) und ich glaube, ich vermisse einfach etwas mit meinem Anfänger Python Augen. Irgendwie muss ich meine Anfragen an die API mit einer HMAC-Signatur authentifizieren - mit der ich vorher noch nicht gearbeitet habe, die aber scheinbar einfach zu erzeugen ist (sie stellen sogar eine Python-Funktion bereit). Doc hier https://duo.com/docs/adminapi#authenticationDuo Security API mit Python-Client

Ich bin bei der Erstellung dieser Signatur für die Authentifizierung, bevor meine Anfrage an die API übergeben. Von https://duo.com/docs/adminapi#authentication:

The API uses HTTP Basic Authentication to authenticate requests. Use your >Duo application’s integration key as the HTTP Username.

Generate the HTTP Password as an HMAC signature of the request. This will >be different for each request and must be re-generated each time.

Es geht dann in die Parameter hinzugefügt werden und die für die HMAC-Signatur korrekt erzeugt werden. Ich verstehe diesen Teil. Mein Problem ist, wie und wann die von mir generierte HMAC-Signatur übergeben wird. Da das Duo doc nicht speziell darauf eingeht, denke ich, dass dies etwas ist, was ich schon wissen sollte [war ich nicht so ein Python-Novize].

Zum Beispiel einfache Auth Anrufe funktionieren (da sie keine Authentifizierung benötigen):

[email protected]:~# python -m duo_client.client --ikey XXXXXXXX --skey XXXXXXXX --host XXXXXXXX.duosecurity.com --method GET --path /auth/v2/check 200 OK 
{ 
"response": 
{ "time": 1496437236 } 
, 
"stat": "OK" 
}

jedoch Anrufe Admin erfordert Authentifizierung verwenden, und somit nicht mit:

[email protected]:~# python -m duo_client.client --ikey XXXXXXXX --skey XXXXXXXX --host XXXXXXXX.duosecurity.com --method GET --path /admin/v1/users signature=XXXXXXXX 
401 Unauthorized 
{ 
    "code": 40103, 
    "message": "Invalid signature in request credentials", 
    "stat": "FAIL" 
}

Vielen Dank im Voraus für jede Einsicht!

== == EDIT

Also dachte ich, ich würde die Funktion schreiben, das Duo für die Erstellung der Signatur zur Verfügung stellen, die ähnlich zu sein scheint, was in der Frage Stackoverflow geschieht ich, dass ich gefunden dachte helfen kann (Python, HTTPS GET with basic authentication). Von https://duo.com/docs/adminapi#authentication:

 
def sign(method, host, path, params, skey, ikey): 
    """ 
    Return HTTP Basic Authentication ("Authorization" and "Date") headers. 
    method, host, path: strings from request 
    params: dict of request parameters 
    skey: secret key 
    ikey: integration key 
    """ 

    # create canonical string 
    now = email.Utils.formatdate() 
    canon = [now, method.upper(), host.lower(), path] 
    args = [] 
    for key in sorted(params.keys()): 
     val = params[key] 
     if isinstance(val, unicode): 
      val = val.encode("utf-8") 
     args.append(
      '%s=%s' % (urllib.quote(key, '~'), urllib.quote(val, '~'))) 
    canon.append('&'.join(args)) 
    canon = '\n'.join(canon) 

    # sign canonical string 
    sig = hmac.new(skey, canon, hashlib.sha1) 
    auth = '%s:%s' % (ikey, sig.hexdigest()) 

    # return headers 
    return {'Date': now, 'Authorization': 'Basic %s' % base64.b64encode(auth)} 

habe ich die obige Funktion in einem einfachen Skript verwendet zum Ausdrucken (nur so kann ich visualisieren), was sollte im Skript übergeben werden immer ich Server unsere Bedürfnisse erstellen werden - I die Funktion zu einem Skript hinzugefügt und Druck verwendet, durch die Zugabe von folgenden:

 
# Printing Signature Headers ### TESTING ### 
print sign('GET', 'XXXhostXXX', '/admin/v1/users', 'XXXparamXXX', 'XXXskeyXXX', 'XXXXikeyXXXX') 

Allerdings bin ich immer diese Fehlermeldung:

 
[email protected]:~# ./duo.py 
Traceback (most recent call last): 
    File "./duo.py", line 39, in 
    print sign('GET', 'XXXhostXXX', '/admin/v1/users', 'XXXparamXXX', 'XXXskeyXXX', 'XXXikeyXXX') 
    File "./duo.py", line 18, in sign 
    for key in sorted(params.keys()): 
AttributeError: 'str' object has no attribute 'keys' 

bin ich nur hier etwas fehlt? Ich habe gesucht, was diesen Fehler verursachen könnte, aber ich dachte, ich würde auch hier fragen.

+0

Gefunden einige Dinge, die mir auf dem Weg helfen sollten - nämlich die zweite Antwort hier: https://StackOverflow.com/Questions/6999565/Python-HTTPs-get-with-Basic-Authentication –

Antwort

0

Dies war ein "Problem" auf Duos Seite ... falsche skey wurde verwendet und mein Benutzer hatte nicht den richtigen Zugang.