为 API get 请求创建 HMAC-SHA1 base 64 签名
Create a HMAC-SHA1 base 64 signature for API get request
问题:
我正在尝试从网站上打印 requests.get,它需要签名。从我在网站上读到的内容来看,它说它需要获取我的密钥并使用 HMAC-SHA1 base 64 对其进行签名。
我知道我需要将 hmac 导入到我的 python 脚本中,但除此之外,我不确定我的签名是否符合网站的要求。
这是关于如何设置身份验证的 link:https://www.ninjarmm.com/dev-api/#the_authentication_header
在网站上,它给出了签名应该如何的示例,但我不知道如何在 python 中应用它:
### How do I apply this in my python script's header?
Signature = Base64( HMAC-SHA1( YourSecretAccessKeyID, Base64( UTF-8- Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-Verb + "n" + Content-MD5 + "n" + Content-Type + "n" + Date + "n" + CanonicalizedResource;
### How do I apply this in my python script's header?
这是我的代码:
import requests
import os
import json
from datetime import date
from email.utils import formatdate
ninjaapi = "some data"
ninjasak = "some data"
ninjaurl = "https://api.ninjarmm.com/v1/devices"
ninjaheaders = {"authorization":ninjaapi + ninjasak, "Date":now,}
ninjastatusresponse = requests.get(ninjaurl, headers=ninjaheaders)
ninja_json = ninjastatusresponse.json()
print(ninja_json)
这是我目前得到的结果:
{'error': 'invalid_header', 'error_description': "Invalid 'Authorization' header", 'error_code': 1}
如果有人有任何我可以测试的想法,请告诉我!
感谢您的宝贵时间,
所以我发现有一个好人已经为所有东西制作了一个模块包。我在我的程序中使用了他的代码,它用于构建签名。
它叫ninjarmm_api;这是 link:https://bitbucket.org/raptus-it/py-ninjarmm-api-client/src/master/ninjarmm_api/
这里是来自 ninjadojo 社区的 link。
https://ninjarmm.zendesk.com/hc/en-us/community/posts/360037165831-Python-client-library-for-API
具体来说,这是他的 auth.py 的代码,这正是我试图弄清楚如何做的。
from requests.auth import AuthBase
from email.utils import formatdate
import base64
import hmac
import hashlib
class auth(AuthBase):
NINJA_HDR_AUTH = "Authorization"
NINJA_HDR_DATE = "Date"
NINJA_ENCODING = "utf-8"
def __init__(self, accessKeyId, secretAccessKey):
self.access_key_id = accessKeyId
self.secret_access_key = secretAccessKey
self.tstamp = formatdate(timeval=None, localtime=False, usegmt=True)
def __call__(self, request):
sts_clear = request.method + "\n" # HTTP verb
sts_clear += "\n" # Content MD5
sts_clear += "\n" # Content type
sts_clear += self.tstamp + "\n" # Date
sts_clear += request.path_url # Canonicalized resource
sts_base64 = base64.b64encode(sts_clear.encode(self.NINJA_ENCODING))
sts_digest = hmac.new(self.secret_access_key.encode(self.NINJA_ENCODING), sts_base64, hashlib.sha1)
signature = base64.b64encode(sts_digest.digest())
request.headers[self.NINJA_HDR_AUTH] = "NJ " + self.access_key_id + ":" + signature.decode(self.NINJA_ENCODING)
request.headers[self.NINJA_HDR_DATE] = self.tstamp
return request
问题: 我正在尝试从网站上打印 requests.get,它需要签名。从我在网站上读到的内容来看,它说它需要获取我的密钥并使用 HMAC-SHA1 base 64 对其进行签名。
我知道我需要将 hmac 导入到我的 python 脚本中,但除此之外,我不确定我的签名是否符合网站的要求。
这是关于如何设置身份验证的 link:https://www.ninjarmm.com/dev-api/#the_authentication_header
在网站上,它给出了签名应该如何的示例,但我不知道如何在 python 中应用它:
### How do I apply this in my python script's header?
Signature = Base64( HMAC-SHA1( YourSecretAccessKeyID, Base64( UTF-8- Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-Verb + "n" + Content-MD5 + "n" + Content-Type + "n" + Date + "n" + CanonicalizedResource;
### How do I apply this in my python script's header?
这是我的代码:
import requests
import os
import json
from datetime import date
from email.utils import formatdate
ninjaapi = "some data"
ninjasak = "some data"
ninjaurl = "https://api.ninjarmm.com/v1/devices"
ninjaheaders = {"authorization":ninjaapi + ninjasak, "Date":now,}
ninjastatusresponse = requests.get(ninjaurl, headers=ninjaheaders)
ninja_json = ninjastatusresponse.json()
print(ninja_json)
这是我目前得到的结果:
{'error': 'invalid_header', 'error_description': "Invalid 'Authorization' header", 'error_code': 1}
如果有人有任何我可以测试的想法,请告诉我!
感谢您的宝贵时间,
所以我发现有一个好人已经为所有东西制作了一个模块包。我在我的程序中使用了他的代码,它用于构建签名。
它叫ninjarmm_api;这是 link:https://bitbucket.org/raptus-it/py-ninjarmm-api-client/src/master/ninjarmm_api/
这里是来自 ninjadojo 社区的 link。 https://ninjarmm.zendesk.com/hc/en-us/community/posts/360037165831-Python-client-library-for-API
具体来说,这是他的 auth.py 的代码,这正是我试图弄清楚如何做的。
from requests.auth import AuthBase
from email.utils import formatdate
import base64
import hmac
import hashlib
class auth(AuthBase):
NINJA_HDR_AUTH = "Authorization"
NINJA_HDR_DATE = "Date"
NINJA_ENCODING = "utf-8"
def __init__(self, accessKeyId, secretAccessKey):
self.access_key_id = accessKeyId
self.secret_access_key = secretAccessKey
self.tstamp = formatdate(timeval=None, localtime=False, usegmt=True)
def __call__(self, request):
sts_clear = request.method + "\n" # HTTP verb
sts_clear += "\n" # Content MD5
sts_clear += "\n" # Content type
sts_clear += self.tstamp + "\n" # Date
sts_clear += request.path_url # Canonicalized resource
sts_base64 = base64.b64encode(sts_clear.encode(self.NINJA_ENCODING))
sts_digest = hmac.new(self.secret_access_key.encode(self.NINJA_ENCODING), sts_base64, hashlib.sha1)
signature = base64.b64encode(sts_digest.digest())
request.headers[self.NINJA_HDR_AUTH] = "NJ " + self.access_key_id + ":" + signature.decode(self.NINJA_ENCODING)
request.headers[self.NINJA_HDR_DATE] = self.tstamp
return request