我正在尝试与duo的python客户端(https://github.com/duosecurity/duo_client_python)一起工作,我相信我的python新手的眼睛只是缺少了一些东西。不知怎么的,我需要使用一个hmac签名来验证我对api的请求——我以前从未使用过这个签名,但生成起来似乎很简单(它们甚至提供了一个python函数)。这里的医生https://duo.com/docs/adminapi#authentication
在将我的请求传递给api之前,我不知道如何为身份验证设计这个签名。从https://duo.com/docs/adminapi#authentication
api使用http基本身份验证对请求进行身份验证。使用>duo应用程序的集成密钥作为http用户名。
生成http密码作为请求的hmac签名。每个请求都不同,每次都必须重新生成。
然后,它将被添加到哪些参数中,这些参数是正确生成hmac签名所必需的。我明白这部分。我的问题是如何以及何时传递我生成的hmac签名。由于duo-doc并没有具体说明这一点,我想这是我应该已经知道的(如果我不是一个python新手的话)。
例如,简单的身份验证调用工作正常(因为它们不需要身份验证):
根@框:~ python-m duo嫒client.client--ikey xxxxxxx--skey xxxxxxx--host xxxxxxx.duosecurity.com--method get--path/auth/v2/check 200确定
{
“回应”:
{“时间”:1496437236}
我是说,
“stat”:“好”
}
但是,使用admin的调用需要身份验证,因此失败的原因是:
根@框:~ python-m duo嫒client.client--ikey xxxxxxxx--skey xxxxxxxx--host xxxxxxxx.duosecurity.com--method get--path/admin/v1/users signature=xxxxxxxx
401未经授权
{
“代码”:40103,
“message”:“请求凭据中的签名无效”,
“stat”:“失败”
}
提前感谢您的任何见解!
==编辑==
所以我想我应该发布duo提供的用于创建签名的函数,它看起来类似于stackoverflow问题中发生的事情,我发现我认为这可能会有帮助(Python, HTTPS GET with basic authentication)。从https://duo.com/docs/adminapi#authentication
def sign(方法、宿主、路径、参数、skey、ikey):
“”
返回http基本身份验证(“授权”和“日期”)头。
方法,主机,路径:来自请求的字符串
params:请求参数的dict
秘密钥匙
集成键
“”
#创建规范字符串
现在=email.utils.formatDate()
佳能=[现在,method.upper(),host.lower(),路径]
args=[]
对于已排序的键(params.keys()):
val=参数[键]
如果IsInstance(VAL,Unicode):
val=val.encode(“utf-8”)
附加参数(
%s=%s%(urllib.quote(key,“~”),urllib.quote(val,“~”))
canon.append('&'。连接(args))
佳能='\n'。连接(佳能)
#符号规范字符串
sig=hmac.new(skey、canon、hashlib.sha1)
身份验证='%s:%s'%(ikey,sig.hexDigest())
#返回标题
返回{'date':现在,'authorization':'basic%s'%base64.b64encode(auth)}
我在一个简单的脚本中使用了上面的函数来打印(只是为了让我可以可视化)我将创建的脚本中应该传递的内容,以满足我们的需要--我将该函数添加到脚本中,并通过添加以下内容来使用print:
#打印签名头测试###
打印符号('get','xxxhostxxx','/admin/v1/users','xxxparamxxx','xxxskeyxxx','xxxxxxkeyxxx')
但是,我得到了这个错误:
根@框:~/duo.py
回溯(最近一次呼叫时间):
文件“/duo.py”,第39行,in
打印符号('get','xxxhostxxx','/admin/v1/users','xxxparamxxx','xxxskeyxxx','xxxikeyxxx')
文件“/duo.py”,第18行,签名
对于已排序的键(params.keys()):
attributeerror:“str”对象没有“keys”属性
我是不是错过了什么?我一直在寻找可能导致这个错误的原因,但我想我也会问这里。

最佳答案

这是duo方面的一个“问题”…使用了错误的skey,而我的用户没有正确的访问权限。

关于python - 具有Python客户端的Duo Security API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44373395/

10-10 15:01