python - 如何在 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"
}
解决方案
安装pyjwt
并cryptography
首先:
$ 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)
推荐阅读
- spring-mvc - 防止 Intellij Idea 检查将控制器方法显示为未使用
- elasticsearch - ElasticSearch 总结嵌套对象字段
- excel - 使用 If 语句执行 while 循环,该语句在满足条件时添加一个值
- regex - 包括可转义字符的正则表达式组
- google-calendar-api - Google Calendar API v3 - 使用应用程序拥有的(非真实用户)帐户进行身份验证
- perl - Perl 将文件内容直接读取到内存中,我说得对吗?
- python - 创建 Numpy 结构化数组
- flask - 从 18.04 升级到 ubuntu 20.04 后 Flask apache2 wsgi 错误
- javascript - 如何恢复 JS-Search 结果?
- github - 将 Github 松弛集成限制为仅分配给我或参与的评论