fastapi_token package

Submodules

fastapi_token.encrypt module

fastapi_token.encrypt.encrypt(payload: bytes, key: bytes, nonce: bytes) bytes[source]
fastapi_token.encrypt.decrypt(payload: bytes, key: bytes, nonce: bytes) bytes[source]
fastapi_token.encrypt.gen_key(key: bytes)[source]
fastapi_token.encrypt.gen_nonce_from_timestamp(timestamp: int)[source]

fastapi_token.oauth2 module

exception fastapi_token.oauth2.TimeExpireError(msg)[source]

Bases: HTTPException

当前的token过期

exception fastapi_token.oauth2.VerifyError(msg)[source]

Bases: HTTPException

验证不通过

exception fastapi_token.oauth2.TokenExpireError(msg)[source]

Bases: HTTPException

user_token过期

class fastapi_token.oauth2.TokenBase[source]

Bases: object

token 生成基类

token生成中使用的变量:

  • user_id 用户id

  • user_token 用户获得的认证token, 用于生成最终的在请求中使用的token, 为字符串

token生成和认证过程:

  1. 利用 user_id 以及其他信息生成 user_token 使用函数 gen_user_token()

  2. 客户端使用 gen_auth_token() 中的编码方式生成 fastapi_token_gen.schemas.Auth 形式的数据

  3. 客户端使用 jwt以及约定的参数对上述生成的数据进行编码, 并组成 OAuth2 Bearer Token 形式发送给服务端

  4. 服务端获取 jwt编码的token后, 利用函数 auth() 对token进行认证

gen_user_token(user_id: str, **config) str[source]

生成用户的token, 用于生成最终认证token

:param user_id 用户ID用于生成认证token :param config :return:

gen_auth_token(user_id: str, user_token: str, **config) Tuple[Auth, str][source]

根据 user_token 生成最终的认证access_token :return:

auth(authorization: str) Auth[source]

认证, 利用access_token 进行认证 :return:

class fastapi_token.oauth2.OAuth2(token_instance: TokenBase, **args)[source]

Bases: OAuth2PasswordBearer

model: SecurityBase
scheme_name: str
class fastapi_token.oauth2.EncryptToken(secret_key: str, algorithm_jwt: str, salt_jwt: str, salt_grand: str, access_token_expire_second: int)[source]

Bases: TokenBase

在HTTP非加密环境下实现认证过程, 并使得认证token的生成不依赖服务端分配而是一次性分配一个密钥,在不暴露此密钥的情况下进行认证. 此过程中 服务端也是无状态的,也就是不需要存储分配给客户的密钥.

利用对称加密方式生成,利用JWS自带签名方式验证,支持增加 user_token 的过期时间和权限管理

user_token 分发和认证过程:

1. 利用 fastapi_token.schemas.AccessField 中的信息生成 key, nonce,使用用chacha20ietf对内置文明进行加密 获得密文作为客户端JWT加密密钥, 利用JWT生成包含上述生成信息和密文的token作为 user_token

2. 客户端解码后得到作为加密密钥的密文和生成信息, 使用加密密钥使用JWT编码 fastapi_token.schemas.EncryptAuth, 发送给服务端

3. 服务端解码token后获得生成密钥的信息, 并重新生成密和初始向量并加密内置明文获取客户端JWT加密的密钥, 并利用此密钥验证客户端发送的token 的签名, 从而验证客户端的 user_token

由于在上述过程中,客户端或者中间攻击者若修改发送的 fastapi_token.schemas.AccessField 中的字段会导致最终服务端还原的密钥 发生改变从而阻止对于 user_token 的修改, 重放攻击可以通过验证客户端发送的token中的时间戳部分防止.

static gen_key(salt: str = '', secret_key='') bytes[source]

生成用于对称加密的密钥,从 secret_key 生成

Returns

auth(authorization: str) EncryptAuth[source]

认证, 利用access_token 进行认证 :return:

check_user_token(user_token: str)[source]
gen_user_token(user_id: str, access_field: Optional[AccessField] = None, **config) str[source]

生成用户的token, 用于生成最终认证token

:param user_id :用户ID :param access_field : 生成的token的权限,不指定则生成最大权限的token :return: jwt 格式的 user_token

static gen_auth_token(user_id: str, user_token: str, **config) Tuple[EncryptAuth, str][source]

这里 user_token 为生成认证的jwt代码 根据 user_token 生成最终的认证access_token

:param user_id :param user_token :param config :return: 认证内容以及jwt加密后内容

class fastapi_token.oauth2.EncryptPlainToken(secret_key: str, algorithm_jwt: str, salt_jwt: str, salt_grand: str, access_token_expire_second: int)[source]

Bases: EncryptToken

auth(authorization: str) GrantToken[source]

认证, 利用access_token 进行认证 :return:

fastapi_token.schemas module

class fastapi_token.schemas.AccessField(*, token_expire: int, allow_method: List[str])[source]

Bases: BaseModel

field to generate encrypt_key

token_expire: int

user_token 过期时间, unix时间戳

allow_method: List[str]

能够进行请求的服务

gen_salt()[source]

保证内容一致时生成一致的字符串用于加盐操作

class fastapi_token.schemas.Auth(*, user_id: str)[source]

Bases: BaseModel

认证token生成所用基类

user_id: str

用户名

class fastapi_token.schemas.GrantToken(*, user_id: str, token_expire: int, allow_method: List[str], jwt_algorithm: str, verify_token: str, encrypt_key: str)[source]

Bases: AccessField, Auth

user_token 生成所用的字段

jwt_algorithm: str

客户端jwt编码所用的算法

verify_token: str

用于验证, 用户将GrandToken中除 encrypy_key 之外内容发送给服务端,返回该key是否有效

user_id: str

用户id

encrypt_key: str

客户端jwt编码所用密钥

class fastapi_token.schemas.EncryptAuth(*, token_expire: int, allow_method: List[str], user_id: str, timestamp: int)[source]

Bases: Auth, AccessField

fastapi_gen.oauth2.EncryptToken 所用认证字段

timestamp: int

当前Unix时间戳,单位是秒,不是毫秒

class fastapi_token.schemas.EncryptTokenConfig(*, secret_key: str, algorithm_jwt: str, salt_jwt: str, salt_grand: str, access_token_expire_second: int)[source]

Bases: BaseModel

secret_key: str
algorithm_jwt: str
salt_jwt: str
salt_grand: str
access_token_expire_second: int
class fastapi_token.schemas.Config(*, token_config: EncryptTokenConfig, allowed_acl: List[str])[source]

Bases: BaseModel

token_config: EncryptTokenConfig
allowed_acl: List[str]

Module contents