NetSuite 和 Synapse 之间的 M2M 客户端凭证流
M2M Client Credential Flow between NetSuite and Synapse
我希望在 Azure 堆栈中的某处创建一个流,以允许我在 Azure Synapse 和 NetSuite 之间获得 M2M 身份验证。目标是能够放弃使用 ODBC 连接器并切换到进行 REST 调用以将数据从 NetSuite 提取到 Synapse。
我已尽我所能遵循 Oracles Help 中的文档。集成记录已创建,所以我唯一缺少的是 Azure 端需要做些什么才能让两个系统相互进行身份验证。
我已经查看了这个 post 但这看起来像是 API 访问 Azure 资源的设置,我希望 Azure Synapse 从 NetSuite 获取数据。
更新:通过遵循此 video,我能够使用 Postman 让 M2M 在 NetSuite 中工作。我仍在尝试弄清楚如何在 Azure 中创建它以允许我创建一个 JWT 以从 Synapse 调用 NetSuite。
更新 2:我现在使用火花池来签署 JWT,当它在本地 运行 时,我能够进行身份验证并获得返回的访问令牌。
import time
import jwt
import http.client
sec = '-----BEGIN PRIVATE KEY-----\nMIIG/gIBADANBgkqhkiG9w0BAQEFAASCBugwggbkAgEAAoIBgQDkW+cE7G05KETS\n#################################################################################\n-----END PRIVATE KEY-----'
jwtheader = {
"alg": "RS256",
"typ": "JWT",
"kid": "rn9dnIL###############"
}
iat = round(time.time(),3)
payload_data = {
"iss": "6477f8bea7f####################",
"scope": ["restlets", "rest_webservices", "suite_analytics"],
"aud": "https://#######.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token",
"exp": iat + 3600,
"iat": iat
}
token = jwt.encode(payload=payload_data,key=sec,headers = jwtheader)
conn = http.client.HTTPSConnection("#######.suitetalk.api.netsuite.com")
payload = 'grant_type=client_credentials&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion='+token
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
conn.request("POST", "/services/rest/auth/oauth2/v1/token", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
然而,当我在 Azure Synapse 中使用火花池时,我返回了 {"error":"invalid_grant"}。代码没有变化。我已经尝试了 requests 库以及 http.client(如上所示)。
针对上述错误,您可以采用其中一种解决方法,
- 确保在授权类型中使用正确的
json
格式,并以给定文档中所示的类似格式提供令牌。例如,您正在关注
grant_type=client_credentials&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=token
- 在您的脚本中尝试使用该服务之前,请确保它能很好地响应您的凭据。
更多信息请参考以下链接:
我在此处复制您的模板时收到同样的错误。但对我来说,一旦我 (1) 将 jwtheader dict 中的算法更改为 PS256 而不是 RS256,并且 (2) 使用 with-open:
未经修改地获取证书密钥,它就起作用了
with open('<path-to-my-cert-key>/auth-key.pem', 'r') as fh:
sec = fh.read() # <-- just as it is
jwtheader = {
"alg": "PS256", # <-- RS256 didn't work for me
"typ": "JWT",
"kid": "<my-certificate-id-from-netsuite>"
}
我可以提到我使用了这个 openssl 命令来生成我的证书,这是 Netsuite 文档中推荐的一个:
openssl req -x509 -newkey rsa:4096 -sha256 -keyout auth-key.pem -out auth-cert.pem -nodes -days 730
希望这也适用于其他人!
PS。确保你像我一样下载 pyjwt 而不是 jwt。这不是同一个框架,时间会告诉我..
我希望在 Azure 堆栈中的某处创建一个流,以允许我在 Azure Synapse 和 NetSuite 之间获得 M2M 身份验证。目标是能够放弃使用 ODBC 连接器并切换到进行 REST 调用以将数据从 NetSuite 提取到 Synapse。
我已尽我所能遵循 Oracles Help 中的文档。集成记录已创建,所以我唯一缺少的是 Azure 端需要做些什么才能让两个系统相互进行身份验证。
我已经查看了这个 post 但这看起来像是 API 访问 Azure 资源的设置,我希望 Azure Synapse 从 NetSuite 获取数据。
更新:通过遵循此 video,我能够使用 Postman 让 M2M 在 NetSuite 中工作。我仍在尝试弄清楚如何在 Azure 中创建它以允许我创建一个 JWT 以从 Synapse 调用 NetSuite。
更新 2:我现在使用火花池来签署 JWT,当它在本地 运行 时,我能够进行身份验证并获得返回的访问令牌。
import time
import jwt
import http.client
sec = '-----BEGIN PRIVATE KEY-----\nMIIG/gIBADANBgkqhkiG9w0BAQEFAASCBugwggbkAgEAAoIBgQDkW+cE7G05KETS\n#################################################################################\n-----END PRIVATE KEY-----'
jwtheader = {
"alg": "RS256",
"typ": "JWT",
"kid": "rn9dnIL###############"
}
iat = round(time.time(),3)
payload_data = {
"iss": "6477f8bea7f####################",
"scope": ["restlets", "rest_webservices", "suite_analytics"],
"aud": "https://#######.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token",
"exp": iat + 3600,
"iat": iat
}
token = jwt.encode(payload=payload_data,key=sec,headers = jwtheader)
conn = http.client.HTTPSConnection("#######.suitetalk.api.netsuite.com")
payload = 'grant_type=client_credentials&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion='+token
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
conn.request("POST", "/services/rest/auth/oauth2/v1/token", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
然而,当我在 Azure Synapse 中使用火花池时,我返回了 {"error":"invalid_grant"}。代码没有变化。我已经尝试了 requests 库以及 http.client(如上所示)。
针对上述错误,您可以采用其中一种解决方法,
- 确保在授权类型中使用正确的
json
格式,并以给定文档中所示的类似格式提供令牌。例如,您正在关注
grant_type=client_credentials&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=token
- 在您的脚本中尝试使用该服务之前,请确保它能很好地响应您的凭据。
更多信息请参考以下链接:
我在此处复制您的模板时收到同样的错误。但对我来说,一旦我 (1) 将 jwtheader dict 中的算法更改为 PS256 而不是 RS256,并且 (2) 使用 with-open:
未经修改地获取证书密钥,它就起作用了with open('<path-to-my-cert-key>/auth-key.pem', 'r') as fh:
sec = fh.read() # <-- just as it is
jwtheader = {
"alg": "PS256", # <-- RS256 didn't work for me
"typ": "JWT",
"kid": "<my-certificate-id-from-netsuite>"
}
我可以提到我使用了这个 openssl 命令来生成我的证书,这是 Netsuite 文档中推荐的一个:
openssl req -x509 -newkey rsa:4096 -sha256 -keyout auth-key.pem -out auth-cert.pem -nodes -days 730
希望这也适用于其他人!
PS。确保你像我一样下载 pyjwt 而不是 jwt。这不是同一个框架,时间会告诉我..