首页 > 解决方案 > 如何在 python 中生成 JWT 断言

问题描述

我正在尝试实施 salesforce einstein 并尝试获得他们的 api 授权。

文档中是这样写的:

创建 JWT 有效负载。有效负载是 JSON,其中包含:

sub—您的电子邮件地址。这是您用于注册 Einstein Platform Services 帐户的 Salesforce 组织中包含的电子邮件地址。

aud - 用于生成令牌的 API 端点 URL。

exp - Unix 时间的过期时间。该值是以秒为单位的当前 Unix 时间加上您希望令牌有效的秒数。出于测试目的,您可以在 Time.is 中获取 Unix 时间。

JWT 有效负载看起来像这样的 JSON。

JSON

{
  "sub": "<EMAIL_ADDRESS>",
  "aud": "https://api.einstein.ai/v2/oauth2/token",
  "exp": <EXPIRATION_SECONDS_IN_UNIX_TIME>
}

使用您的 RSA 私钥对 JWT 有效负载进行签名以生成断言。私钥包含在您注册帐户时下载的 einstein_platform.pem 文件中。生成断言的代码因您的编程语言而异。如果你在做手动测试,你可以使用 jwt.io 生成一个断言。

如何在python中生成断言字符串?

发现jwt处理可以用pyjwt来完成。 https://pyjwt.readthedocs.io/en/latest/ 但我对获取断言字符串究竟需要做什么感到困惑。

调用 curl 请求以获取响应

curl -X POST \
  https://api.einstein.ai/v2/oauth2/token \
  -H 'Content-type: application/x-www-form-urlencoded' \
  -H 'cache-control: no-cache' \
  -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2FwaS5laW5zdGVpbi5haS92Mi9vYXV0aDIvdG9rZW4iLCJleHAiOjM2MDAsInN1YiI6ImJpdHR1LmNwcEBnbWFpbC5jb20ifQ.MHPzgIGThAwHzGCgEAHU8MyJafbIBQVuK_nW4f5ZUh8hN6eh50XbuP7YnDsCeTH0tIQA0OZlEveVnwnmvi1slnNEhad30NB76J-eLCBYK1xUnj2ZfESRaXxP65XMj_KRWdqgF9dMNLsjA08pPeFkBT1rSM8EmWxlCm_BuDPuQRt1zuSSdtWBInIeBafHhyMmdptTHMTeah0epZiyVhyiGscVkApU0bzhUG5AYGixEldemM6xATWs5EjEfZa-4kG26p2QhyHdjIno2n63nuq82A4Kna4GpHlo7QdqRvvUSDJFB_pM33s_LmMxGY_mNmUuDqpQdJ2k15OF9fvnVTUuVg&undefined='

但得到的答案为

{
    "message": "Invalid JWT assertion"
}

标签: pythonjwtsalesforce-einstein

解决方案


安装pyjwtcryptography首先:

$ pip install pyjwt
$ pip install cryptography

读取您的.pem文件内容并使用它来生成断言字符串,如下所示:

import jwt

payload = {
  "sub": "<EMAIL_ADDRESS>",
  "aud": "https://api.einstein.ai/v2/oauth2/token",
  "exp": "<EXPIRATION_SECONDS_IN_UNIX_TIME>" # UNIX timestamp (integer)
}

with open('einstein_platform.pem') as f:
    assertion_string = jwt.encode(payload, f.read(), algorithm='RS256')

print(assertion_string)

推荐阅读