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。这不是同一个框架,时间会告诉我..