无记名代币
最常见的OAuth 2令牌类型。
持有者令牌是所有已配置终端的默认设置。通常,您不需要自己构建令牌,因为提供的服务器将为您构建令牌。
默认情况下, *Server 将不记名令牌生成为随机字符串。但是,您可以更改默认行为以生成JWT。所有预配置的服务器都作为参数 token_generator 和 refresh_token_generator 以满足您的需求。
1.生成签名JWT
有一个函数可用于生成带有静态和动态声明的签名JWT(使用RS256 PEM密钥)。
from oauthlib.oauth2.rfc6749 import tokens
from oauthlib.oauth2 import Server
private_pem_key = <load_your_key_in_pem_format>
validator = <instantiate_your_validator>
server = Server(
your_validator,
token_generator=tokens.signed_token_generator(private_pem_key, issuer="foobar")
)
请注意,您可以在中添加任何自定义声明 RequestValidator 方法,将它们添加到 request.claims 字典。示例如下:
def validate_client_id(self, client_id, request):
(.. your usual checks ..)
request.claims = {
'aud': self.client_id
}
return True
一旦完成,令牌端点将生成JWT形式的ACCESS_TOKEN:
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJy(..)&expires_in=120&token_type=Bearer(..)
你会发现所有索赔都以其解码的形式出现:
{
"aud": "<client_id>",
"iss": "foobar",
"scope": "profile calendar",
"exp": 12345,
}
2.定义您自己的实现(Text、JWT、JWE等)
有时,您可能希望生成自定义 access_token 使用来自数据库的引用(作为文本),或者使用JWT中的散列签名,或者使用JWE(加密内容)。
另外,请注意,您可以在实例化的验证器中声明生成函数,以受益于 self 变量。
请参见下面的示例:
class YourValidator(RequestValidator):
def __init__(self, secret, issuer):
self.secret = secret
self.issuer = issuer
def generate_access_token(self, request):
token = jwt.encode({
"ref": str(libuuid.uuid4()),
"aud": request.client_id,
"iss": self.issuer,
"exp": now + datetime.timedelta(seconds=request.expires_in)
}, self.secret, algorithm='HS256').decode()
return token
然后将其与您的 Server :
validator = YourValidator(secret="<your_secret>", issuer="<your_issuer_id>")
server = Server(
your_validator,
token_generator=validator.generate_access_token
)
3.BearerToken接口
如果没有一个 预配置的一体机服务器 满足您的需要,您可以声明自己的终结点并使用 BearerToken 接口如下。