无记名代币

最常见的OAuth 2令牌类型。

持有者令牌是所有已配置终端的默认设置。通常,您不需要自己构建令牌,因为提供的服务器将为您构建令牌。

默认情况下, *Server 将不记名令牌生成为随机字符串。但是,您可以更改默认行为以生成JWT。所有预配置的服务器都作为参数 token_generatorrefresh_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 接口如下。

class oauthlib.oauth2.BearerToken(request_validator=None, token_generator=None, expires_in=None, refresh_token_generator=None)[源代码]
create_token(request, refresh_token=False, **kwargs)[源代码]

创建BearerToken,默认情况下不带刷新令牌。

参数:
  • request (oauthlib.common.Request) -- OAuthlib请求。

  • refresh_token --

estimate_type(request)[源代码]
参数:

request (oauthlib.common.Request) -- OAuthlib请求。

validate_request(request)[源代码]
参数:

request (oauthlib.common.Request) -- OAuthlib请求。