create_access_token并没有algorithm和private_key这2个参数啊
时间: 2024-01-16 15:04:14 浏览: 107
非常抱歉,我犯了一个错误。确实,`create_access_token`函数没有`algorithm`和`private_key`这两个参数,因为`flask_jwt_extended`库默认使用HS256算法进行JWT签名和验证,所以我们需要先更改默认算法并添加我们自己的密钥。
下面是一个使用RSA非对称加密的示例:
1. 安装所需的依赖
```
pip install flask flask_jwt_extended cryptography
```
2. 生成RSA密钥对
```
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
public_key = private_key.public_key()
# 保存私钥
with open('private_key.pem', 'wb') as f:
f.write(private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
))
# 保存公钥
with open('public_key.pem', 'wb') as f:
f.write(public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
))
```
3. 更改默认的JWT算法和密钥
```
from flask import Flask
from flask_jwt_extended import JWTManager
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 这个密钥不用于签名,只用于加密
app.config['JWT_ALGORITHM'] = 'RS256'
jwt = JWTManager(app)
# 加载RSA密钥
with open('private_key.pem', 'rb') as f:
private_key = serialization.load_pem_private_key(
f.read(),
password=None,
backend=default_backend()
)
with open('public_key.pem', 'rb') as f:
public_key = serialization.load_pem_public_key(
f.read(),
backend=default_backend()
)
# 设置JWT密钥和算法
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti']
return jti in blacklist
@jwt.user_identity_loader
def user_identity_lookup(user):
return user.id
@jwt.user_loader_callback_loader
def user_loader_callback(identity):
return User.query.get(identity)
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti']
return jti in blacklist
@jwt.additional_claims_loader
def add_claims_to_access_token(identity):
return {
'foo': 'bar'
}
if __name__ == '__main__':
app.run()
```
在这个示例中,我们使用RSA非对称加密算法来对JWT进行签名和验证。在加载RSA密钥时,我们使用`cryptography`库来读取PEM格式的密钥文件并转换为`cryptography`库可以使用的密钥对象。然后,我们使用`@jwt.token_in_blacklist_loader`装饰器来添加一个回调函数,以便我们可以在Token黑名单中检查Token是否存在。我们还使用`@jwt.user_identity_loader`和`@jwt.user_loader_callback_loader`装饰器来指定用户的身份和用户回调函数。最后,我们使用`@jwt.additional_claims_loader`装饰器来添加自定义的JWT声明。
阅读全文