标签: pyjwt

在 python 中使用 PyJWT 解码 jwt 令牌给出错误 算法不支持

我正在使用 PyJWT 解码来自 keycloak 的 JWT 令牌。

eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ6MWpiUExrTndMVTBkTHk3a0NIT1pyS2FJd3FPMXFrbThDeGtvVHg2QzFBIn0..aksSjBU5hJ1rtn43NtbMt8E6gaGmJXDrtGDI7j0T7eo6PA cnUxG4spYNNhyksXVr3ZFvua2WyTKnZirqaJUI3zzdLj-XkE7zYCYWoJpjXITmmlj5oszD3pcRdGeyUVyQV49tIiUfUFi1KoIt9K016mH2s_beFrN3TYSjuLh5Epdk_dpNBh9YE_1f3opwsEbN2Jgz_j -VB6cQHq17RzWQIVSd6ZvftAWDWdc6nobOvTy1mZAA_DgsXwdjuNC8Qv36ztuDzkT-raCnuLH479ciBOFQZ0946obIE4ddJKpr7lnVupcbQZ6lDM_QZHz1hwkYqgSU-Ui8NHaWlqt4HJ5-9A

我的代码

import jwt
import traceback


try:
    public_key = """-----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhlOIQLHXwZoS3w9SBtvZ1ea4ftWmWnP+HCwlvs7XoJ9EhS+ZQEP7Z25tjW3I8mjUVL0XETrOOjQsD8O2nRBqizJsRaB8L9xsXdJmPHVTx7nphaBPtY5YHxxYqpwEC5rAKtx54YJxw6Ggeicmv+xXtaaDf/VALh5xxpa1U6yP5oqk3yV27yA0beQFVsdugkcfYN0C2FldaUcF9yTUf/KNHTYSu3Ar7iN9U+qEHwaznrLShwh7iknldTKTgEw3liHL8K/5ZlqxHPsL02InwZMaIRic3zNIgVvwedroM6nqZBB4mi1+T0dZn4qsNkG4D0w7IE7MTRgyyYARqrGEq5yOFwIDAQAB
    -----END PUBLIC KEY-----"""

    secret_key = "base-flask-oidc-secret-key"
    token = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ6MWpiUExrTndMVTBkTHk3a0NIT1pyS2FJd3FPMXFrbThDeGtvVHg2QzFBIn0.eyJleHAiOjE2MjE0MjQwMjEsImlhdCI6MTYyMTQyMzk2MSwiYXV0aF90aW1lIjoxNjIxNDIxNzc0LCJqdGkiOiIwYzY2Y2I0My1lMGY1LTQzNjItYTc2MS1lN2M2OWVhNDM5MjUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvbWFzdGVyIiwiYXVkIjpbIm1hc3Rlci1yZWFsbSIsImFjY291bnQiXSwic3ViIjoiN2Y2ODBlN2MtZGM4Yy00ZGJiLWJiZDEtMTE0ZGJhYjA2Zjc1IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYW11bmRzZW4tZnJvbnRlbmQiLCJzZXNzaW9uX3N0YXRlIjoiYTM5YzJlNmUtZGNjMS00OTM5LTg0ODItYzk2NGE5ODMxNmYyIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwOi8vbG9jYWxob3N0OjUwMDAiLCJsb2NhbGhvc3Q6NTAwMCJdLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiY3JlYXRlLXJlYWxtIiwib2ZmbGluZV9hY2Nlc3MiLCJhZG1pbiIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsibWFzdGVyLXJlYWxtIjp7InJvbGVzIjpbInZpZXctcmVhbG0iLCJ2aWV3LWlkZW50aXR5LXByb3ZpZGVycyIsIm1hbmFnZS1pZGVudGl0eS1wcm92aWRlcnMiLCJpbXBlcnNvbmF0aW9uIiwiY3JlYXRlLWNsaWVudCIsIm1hbmFnZS11c2VycyIsInF1ZXJ5LXJlYWxtcyIsInZpZXctYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS11c2VycyIsIm1hbmFnZS1ldmVudHMiLCJtYW5hZ2UtcmVhbG0iLCJ2aWV3LWV2ZW50cyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsIm1hbmFnZS1jbGllbnRzIiwicXVlcnktZ3JvdXBzIl19LCJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiYWRtaW5maXJzdCBhZG1pbmxhc3QiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiJhZG1pbmZpcnN0IiwiZmFtaWx5X25hbWUiOiJhZG1pbmxhc3QiLCJlbWFpbCI6ImFkbWludGVzdEBnbWFpbC5jb20ifQ.aksSjBU5hJ1rtn43NtbMt8E6gaGmJXDrtGDI7j0T7eo6PAcnUxG4spYNNhyksXVr3ZFvua2WyTKnZirqaJUI3zzdLj-XkE7zYCYWoJpjXITmmlj5oszD3pcRdGeyUVyQV49tIiUfUFi1KoIt9K016mH2s_beFrN3TYSjuLh5Epdk_dpNBh9YE_1f3opwsEbN2Jgz_j-VB6cQHq17RzWQIVSd6ZvftAWDWdc6nobOvTy1mZAA_DgsXwdjuNc8Qv36ztuDzkT-raCnuLH479ciBOFQZ0946obIE4ddJKpr7lnVupcbQZ6lDM_QZHz1hwkYqgSU-Ui8NHaWlqt4HJ5-9A"
    # token_json = jwt.decode(token, secret_key, algorithms=['HS256', 'RS256'], audience='account')
    token_json = jwt.decode(token, public_key, algorithms=['HS256', 'RS256'], audience='account')
    print(access_token_json)
    
except Exception:
    print(traceback.print_exc())
Run Code Online (Sandbox Code Playgroud)

根据 jwt.io,它显示标题

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "z1jbPLkNwLU0dLy7kCHOZrKaIwqO1qkm8CxkoTx6C1A"
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用公钥和秘密密钥,两者都给我错误

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/jwt/api_jws.py", line 232, in _verify_signature
    alg_obj = self._algorithms[alg]
KeyError: 'RS256'

During handling of …
Run Code Online (Sandbox Code Playgroud)

python jwt keycloak pyjwt

17
推荐指数
1
解决办法
3万
查看次数

使用 django rest 框架 jwt 向 JWT 令牌主体添加信息

我使用 django rest 框架和 djangorestframework-jwt 包来创建 JWT 令牌以进行授权。

在前端,我可以解码令牌并获取用户名、电子邮件和 user_id。但是我想检索一些额外的信息。例如,如果我可以获取kind授权模型(用户模型)上的字段,那将非常方便。

我当然可以单独请求通过常规 APIView 获取用户信息。但我想知道是否可以在 JWT 正文中添加一些额外的参数?

python django jwt django-rest-framework pyjwt

8
推荐指数
2
解决办法
2912
查看次数

PyJWT 返回无效的令牌签名

我正在使用 PyJWT==1.4.2 来生成我打算用于 Firebase 身份验证的令牌。

不幸的是,我无法使用任何第三方 Python Firebase 库,即使可以,在尝试使用 FirebaseTokenGenerator 时也遇到了同样的困难。

在我的 API 内部,我有一个为用户名生成令牌的函数。

118     def generate_token(self, username):
119         payload = {
120             'something': 'Here',
121         }   
122         secret = "TESTSECRET"
123         token = jwt.encode(
124             payload,
125             secret,
126             algorithm='HS256')
127         return token
Run Code Online (Sandbox Code Playgroud)

我从这个函数得到的令牌的一个例子是:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21ldGhpbmciOiJIZXJlIn0.fpIMSRJ3AAL30LIDwHJM9ZOumdRzS7yooiiUgMPms2Y

不幸的是,这不是一个有效的令牌。https://jwt.io/等在线资源告诉我签名部分无效。

不确定这是否是进一步有用的信息,但是当我尝试解码令牌时,我得到以下信息:

b'{"alg":"HS256","typ":"JWT"}{"something"[83 chars]\x88'
Run Code Online (Sandbox Code Playgroud)

关于我可能做错了什么的任何想法?

python jwt firebase firebase-authentication pyjwt

8
推荐指数
2
解决办法
1万
查看次数

JWT在python中加密有效负载?(JWE)

根据RFC 7516,应该可以加密有效载荷/声明,称为JWE.

有没有支持它的python库?

我已经检查了PyJWT,python-jose和jwcrypto,但他们都只是用HS256(JWS)签名的例子.

对不起,如果这是非常明显的,但是当谈到涉及加密的事情时,我会格外谨慎.

python jwt jwe pyjwt python-jose

7
推荐指数
1
解决办法
4401
查看次数

哪个定时 JSONWebSignature 序列化器替代其危险更好?pyjwt 或 authlib

目前,我正在使用itsdangerous生成定时 json Web 签名作为用户进行身份验证和重置密码等的令牌。以下是代码:

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

class SampleCode:
    def generate_confirmation_token(self, expiration=600):
        s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration)
        return s.dumps({'confirm': self.id}).decode('utf-8')

    def confirm(self, token):
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token.encode('utf-8'))
        except:
            return False
        if data.get('confirm') != self.id:
            return False
        self.confirmed = True
        db.session.add(self)
        return True
Run Code Online (Sandbox Code Playgroud)

由于TimedJSONWebSignatureSerializer弃用并删除,itsdangerous 2.1.0我认为我可能需要转向提供 JWT/JWS 接口的其他一些库。

这里我有两个候选人,哪一个更好:

flask pyjwt itsdangerous authlib

7
推荐指数
1
解决办法
3766
查看次数

使用 PyJWT 进行 Jwt 解码引发签名验证失败

我在 django 视图中解码 jwt 令牌时遇到了一个奇怪的问题。如果我尝试 jwt.decode('encoded_token', 'secret') 然后我会看到“签名验证失败”消息。为了避免这个问题,我将验证标志设置为 False:

jwt.decode('eroded_token', 'secret', verify=False)
Run Code Online (Sandbox Code Playgroud)

这使解码的有效负载没有错误,但我试图弄清楚如何在不将验证标志设置为 False 的情况下成功验证令牌。有任何想法吗?

谢谢

python authentication django jwt pyjwt

6
推荐指数
1
解决办法
3419
查看次数

使用承载令牌授权标头(flask_restful +flask_jwt_extended)发送 GET 消息时出现“段不足”

我在 Flask 应用程序中收到此错误:

curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd"
{
  "msg": "Not enough segments"
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例:

from flask import Flask
from flask_restful import Resource, Api
from flask_jwt_extended import JWTManager, jwt_required

app = Flask(__name__)
jwt = JWTManager(app)
api = Api(app)


class HelloWorld(Resource):
    @jwt_required
    def get(self):
        return {'hello': 'world'}


api.add_resource(HelloWorld, '/')
Run Code Online (Sandbox Code Playgroud)

安慰:

 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active! …
Run Code Online (Sandbox Code Playgroud)

flask flask-restful pyjwt flask-jwt-extended jwt-auth

6
推荐指数
1
解决办法
9704
查看次数

Python JWT 库 PyJWT 无法使用 HS256 签名 - HMAC 使用 SHA-256 哈希算法

尝试使用PyJWT库生成 JWT 令牌。

当我使用以下程序生成 JWT 令牌时 - 该令牌不起作用。

但是,当我使用 具有相同详细信息的网站https://jwt.io/时 - 令牌有效。有什么我想念的吗。

我需要 python 正确生成令牌,以便我可以自动化一些需要此令牌的 API。

蟒蛇程序:

import jwt
import base64

code = jwt.encode({'sub':'String','nbf':'1501594247',
                   'exp':'1501767047', 'iss': 'string', 'aud': 'String'},
       base64.b64encode('secret'), algorithm='HS256')
print code
Run Code Online (Sandbox Code Playgroud)

例子:

code = jwt.encode({'sub':'AccountNUmber.QTVR','nbf':'1501594247','exp':'1501860089', 'iss': 'client_id', 'aud': 'https://login.google.com/oauth'},
                  base64.b64encode('secret'), algorithm='HS256')
Run Code Online (Sandbox Code Playgroud)

结果:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnRfaWQiLCJhdWQiOiJodHRwczovL2xvZ2luLmdvb2dsZS5jb20vb2F1dGgiLCJzdWIiOiJBY2NvdW50TlVtYmVyLlFUVlIiLCJleHAiOiIxNTAxODYwMDg5IiwibmJmIjoiMTUwMTU5NDI0NyJ9.dRUUQYJ-RmxgoExwPyrvHPzX9SsxcpX1rOWlhisxNsg

https://jwt.io/生成的令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnRfaWQiLCJhdWQiOiJodHRwczovL2xvZ2luLmdvb2dsZS5jb20vb2F1dGgiLCJzdWIiOiJBY2NvdW50TlVtYmVyLlFUVlIiLCJleHAiOiIxNTAxODYwMDg5IiwibmJmIjoiMTUwMTU5NDI0NyJ9.INp-ZnnL8Uj7MIwLYmpZtGyTyZG-oqZRNW8iZ145jVs

当我调用端点时,由https://jwt.io/生成的令牌有效。我得到一个状态代码 200(成功)。

但是,当我使用从我的程序生成的令牌时,它会给出“无效令牌” - 400(错误请求)。

python jwt pyjwt

5
推荐指数
1
解决办法
4234
查看次数

如何使用 pyJWT 验证此 JWT 上的签名?

我收到了 JWT 令牌。\n我有兴趣解压它并验证它的内容。

\n\n

我想使用pyJWT库来做到这一点。请看下面的小程序。

\n\n

我已成功对 JWT 进行 Base64 解码。我已经从网上检索到匹配的JWK。但我不知道接下来要做什么来验证签名。

\n\n

当我尝试执行jwt.decode()以下操作时,出现错误jwt.exceptions.DecodeError: Not enough segments

\n\n
# !/usr/bin/env python\n\nimport jwt\nimport base64\nimport json\nimport requests\n\nmy_jwt = "eyJqa3UiOiJodHRwczovL2U5N2I4YTlkNjcyZTRjZTQ4NDVlYzY5NDdjZDY2ZW" \\\n         "Y2LXNiLmJhYXMubmludGVuZG8uY29tLzEuMC4wL2NlcnRpZmljYXRlcyIsImtp" \\\n         "ZCI6ImZlOWRiYmZmLTQ3MGItNDZjOC04YmFmLTFiNzY5OGRlZTViZSIsImFsZy" \\\n         "I6IlJTMjU2In0.eyJpc3MiOiJodHRwczovL2U5N2I4YTlkNjcyZTRjZTQ4NDVl" \\\n         "YzY5NDdjZDY2ZWY2LXNiLmJhYXMubmludGVuZG8uY29tIiwiZXhwIjoxNTQ1MT" \\\n         "g1NDk2LCJ0eXAiOiJpZF90b2tlbiIsImF1ZCI6IjhkOTc1NTllNjNlY2NkNTYi" \\\n         "LCJiczpkaWQiOiI2NjJhZTQwOWYwNTQyYTBjIiwic3ViIjoiOTNkYmYwNDdiYT" \\\n         "I3NzQ5NSIsImp0aSI6IjY1NDg4ZjJmLTI1NzAtNDBkYy04ODQ3LTMzODNlZWIx" \\\n         "MGJiYiIsIm5pbnRlbmRvIjp7ImFpIjoiMDEwMGY4MDAwMDQ5MjAwMCIsImF2Ij" \\\n         "oiMDAwMCIsImVkaSI6ImJjNTdiYmM3MTZlMDA1MGFmOWRhN2NkYTIzMWRjZDgy" \\\n         "IiwiYXQiOjE1NDUxNzQ2OTZ9LCJpYXQiOjE1NDUxNzQ2OTZ9.ZMUIt3wYrbfhX" \\\n         "nnDh4WraGlKrZy0YuL5prluY70sU_-0W5XvWIB-xmTrLz7LJWHEGwTskcWf81_" \\\n         "HBq_mSb75rMfTAEBwBmOJ4ITmhdnXksz8w7EDOWuPPSEft5XLMNOMD16ztEOYe" \\\n         "5ddU_iqNEbT56L7fcAJEXv0FWy6H_OutxOglYpDaNkcj6CWJ7dpA0JbqerR9dE" \\\n         "szaLwyn1ZBDPVD0YeAIm5bEr61imeedzMb0amxlTl4R87mqK6epsFUnRy6p6Kl" \\\n         "r27_DlTLQ-gej09W7NeNzONCj4thHgCr9szAiaN28krfTc2fobz3qFCoC_eQgh" \\\n         "iIIZBe_-Lksng3Eg6tw"\n\ndecoded_token = [\n    base64.b64decode(i + \'=\' * (-len(i) % 4))\n    for i in my_jwt.split(\'.\')\n]\nheader = json.loads(decoded_token[0])\nclaims = …
Run Code Online (Sandbox Code Playgroud)

python jwt pyjwt

5
推荐指数
1
解决办法
1万
查看次数

如何确定 PyJWT 的版本?

我有两个不同的软件环境(Environment AEnvironment B),我正在尝试在这两种环境上运行 PyJWT。它在一个环境Environment A上运行良好,但在Environment B上失败。

我得到的错误环境B当我打电话jwt.encode()algorithm==ES是:Algorithm not supported

我试图弄清楚为什么它适用于环境 A而不是环境 B。这两个环境似乎安装了不同版本的 PyJWT。但是确定在环境 B上安装了哪个版本的 PyJWT对我来说很困难。我该怎么做??

我在环境 A环境 B上运行了以下检测代码:

import jwt, cryptography, sys, pkg_resources

my_private_key = """XXXXX"""
my_public_key = """YYYYYY"""
original = {"Hello": "World"}
print "sys.version = {}".format(str(sys.version))

try:
    print "dir(jwt) = {}".format(str(dir(jwt)))
except Exception as e:
    print "Failed to get dir of …
Run Code Online (Sandbox Code Playgroud)

python pyjwt

4
推荐指数
1
解决办法
2864
查看次数