2017-06-05 21 views
0

デュオのPythonクライアント(https://github.com/duosecurity/duo_client_python)で作業しようとしていますが、私は初心者のPythonの目で何かを逃していると思います。私は何とかHMAC署名を使ってAPIへの私の要求を認証する必要があります。これは私が以前にはやっていないが、生成するのは簡単ではない(Python関数を提供する)。 Doc here https://duo.com/docs/adminapi#authenticationデュオセキュリティAPIとPythonクライアント

私の要求をAPIに渡す前に、認証のためにこの署名を作成する方法が失われています。 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.

次に、HMAC署名が適切に生成するためのパラメータを追加し、必要に応じているに入ります。私はこの部分を理解しています。私の問題は、私が生成するHMAC署名をいつ、どのように渡すかです。デュオのドキュメンタリーはそれに具体的には言及していないので、これは私が既に知っているはずのものだと思っています[私はそのようなPython初心者ではありませんでした]。しかし

[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" 
}

、管理者を使用して呼び出し、認証を必要とし、ひいてはで失敗:

は例えば、簡単な認証のコールは(彼らは認証を必要としないので)正常に動作事前に

[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" 
}

感謝任意の洞察力のために!

== EDITの==

は、だから私は、私はデュオは私が役立つかもしれないと思ったことがわかっStackOverflowの質問に何が起こっているかのように表示された署名を、作成するための提供機能を投稿しようと思いました(Python, HTTPS GET with basic authentication )。 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)} 

私は(ちょうどので、私は視覚化することができます)私は、我々のニーズのサーバーに作成しますスクリプト内で渡さ取得しなければならないかを印刷する簡単なスクリプトで上記の機能を使用しました - 私は、スクリプトに機能を追加し、以下を追加して印刷を使用:しかし、私はこのエラーを

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

を取得しています:

 
[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' 

私はちょうどここに何かが足りないのですか?私はそのエラーを引き起こす可能性のあるものを探していましたが、ここでも尋ねると思いました。

+0

途中で私を助けなければならないものがいくつか見つかりました。つまり、2番目の答えはhttps://stackoverflow.com/questions/6999565/python-https-get-with-basic-authenticationです。 –

答えて

0

これはDuo側の「問題」でした...間違ったskeyが使用されていて、ユーザーに適切なアクセス権がありませんでした。

関連する問題