如何在python中生成JWT断言

时间:2019-06-04 05:01:50

标签: python jwt salesforce-einstein

我正在尝试实施salesforce爱因斯坦,并试图获得其api的授权。

docs中写为:

  

创建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中生成断言字符串?

可以用pyjwt完成找到的jwt处理。 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"
}

1 个答案:

答案 0 :(得分:3)

首先安装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)