133 lines
5.3 KiB
Python
133 lines
5.3 KiB
Python
![]() |
from lark_oapi.core import JSON, Strings
|
||
|
from lark_oapi.core.cache import *
|
||
|
from lark_oapi.core.const import UTF_8
|
||
|
from lark_oapi.core.exception import ObtainAccessTokenException
|
||
|
from lark_oapi.core.http import Transport
|
||
|
from lark_oapi.core.model import Config, RawResponse
|
||
|
from .access_token_response import AccessTokenResponse
|
||
|
from .create_isv_app_token_request import CreateIsvAppTokenRequest
|
||
|
from .create_isv_tenant_token_request import CreateIsvTenantTokenRequest
|
||
|
from .create_self_app_token_request import CreateSelfAppTokenRequest
|
||
|
from .create_self_tenant_token_request import CreateSelfTenantTokenRequest
|
||
|
from .create_token_request_body import CreateTokenRequestBody
|
||
|
|
||
|
|
||
|
class TokenManager(object):
|
||
|
cache: ICache = LocalCache.instance()
|
||
|
|
||
|
@staticmethod
|
||
|
def get_self_app_token(conf: Config) -> str:
|
||
|
# 读缓存
|
||
|
cache_key = f"self_app_token:{conf.app_id}"
|
||
|
token = TokenManager.cache.get(cache_key)
|
||
|
if Strings.is_not_empty(token):
|
||
|
return token
|
||
|
|
||
|
# 缓存不存在则发起请求获取token
|
||
|
req: CreateSelfAppTokenRequest = CreateSelfAppTokenRequest.builder() \
|
||
|
.request_body(CreateTokenRequestBody.builder()
|
||
|
.app_id(conf.app_id)
|
||
|
.app_secret(conf.app_secret)
|
||
|
.build()) \
|
||
|
.build()
|
||
|
raw: RawResponse = Transport.execute(conf, req)
|
||
|
resp = JSON.unmarshal(str(raw.content, UTF_8), AccessTokenResponse)
|
||
|
|
||
|
if not resp.success():
|
||
|
raise ObtainAccessTokenException("obtain self app access token failed", resp.code, resp.msg)
|
||
|
|
||
|
# 写缓存
|
||
|
token = resp.app_access_token
|
||
|
expire = time.time() + resp.expire - 10 * 60 # 提前10分钟过期
|
||
|
TokenManager.cache.set(cache_key, token, int(expire))
|
||
|
|
||
|
return token
|
||
|
|
||
|
@staticmethod
|
||
|
def get_self_tenant_token(config: Config) -> str:
|
||
|
# 读缓存
|
||
|
cache_key = f"self_tenant_token:{config.app_id}"
|
||
|
token = TokenManager.cache.get(cache_key)
|
||
|
if Strings.is_not_empty(token):
|
||
|
return token
|
||
|
|
||
|
# 缓存不存在则发起请求获取token
|
||
|
req: CreateSelfTenantTokenRequest = CreateSelfTenantTokenRequest.builder() \
|
||
|
.request_body(CreateTokenRequestBody.builder()
|
||
|
.app_id(config.app_id)
|
||
|
.app_secret(config.app_secret)
|
||
|
.build()) \
|
||
|
.build()
|
||
|
raw: RawResponse = Transport.execute(config, req)
|
||
|
resp = JSON.unmarshal(str(raw.content, UTF_8), AccessTokenResponse)
|
||
|
|
||
|
if not resp.success():
|
||
|
raise ObtainAccessTokenException("obtain self tenant access token failed", resp.code, resp.msg)
|
||
|
|
||
|
# 写缓存
|
||
|
token = resp.tenant_access_token
|
||
|
expire = time.time() + resp.expire - 10 * 60 # 提前10分钟过期
|
||
|
TokenManager.cache.set(cache_key, token, int(expire))
|
||
|
|
||
|
return token
|
||
|
|
||
|
@staticmethod
|
||
|
def get_isv_app_token(config: Config, app_ticket: str) -> str:
|
||
|
# 读缓存
|
||
|
cache_key = f"isv_app_token:{config.app_id}"
|
||
|
token = TokenManager.cache.get(cache_key)
|
||
|
if Strings.is_not_empty(token):
|
||
|
return token
|
||
|
|
||
|
if Strings.is_empty(app_ticket):
|
||
|
# TODO: get app ticket from ticket cache
|
||
|
pass
|
||
|
|
||
|
# 缓存不存在则发起请求获取token
|
||
|
req: CreateIsvAppTokenRequest = CreateIsvAppTokenRequest.builder() \
|
||
|
.request_body(CreateTokenRequestBody.builder()
|
||
|
.app_id(config.app_id)
|
||
|
.app_secret(config.app_secret)
|
||
|
.app_ticket(app_ticket).build()) \
|
||
|
.build()
|
||
|
raw: RawResponse = Transport.execute(config, req)
|
||
|
resp = JSON.unmarshal(str(raw.content, UTF_8), AccessTokenResponse)
|
||
|
|
||
|
if not resp.success():
|
||
|
raise ObtainAccessTokenException("obtain isv app access token failed", resp.code, resp.msg)
|
||
|
|
||
|
# 写缓存
|
||
|
token = resp.app_access_token
|
||
|
expire = time.time() + resp.expire - 10 * 60 # 提前10分钟过期
|
||
|
TokenManager.cache.set(cache_key, token, int(expire))
|
||
|
|
||
|
return token
|
||
|
|
||
|
@staticmethod
|
||
|
def get_isv_tenant_token(config: Config, tenant_key: str, app_ticket: str) -> str:
|
||
|
# 读缓存
|
||
|
cache_key = f"isv_tenant_token:{config.app_id}:{tenant_key}"
|
||
|
token = TokenManager.cache.get(cache_key)
|
||
|
if Strings.is_not_empty(token):
|
||
|
return token
|
||
|
|
||
|
app_token = TokenManager.get_isv_app_token(config, app_ticket)
|
||
|
# 缓存不存在则发起请求获取token
|
||
|
req: CreateIsvTenantTokenRequest = CreateIsvTenantTokenRequest.builder() \
|
||
|
.request_body(CreateTokenRequestBody.builder()
|
||
|
.app_access_token(app_token)
|
||
|
.tenant_key(tenant_key).build()) \
|
||
|
.build()
|
||
|
raw: RawResponse = Transport.execute(config, req)
|
||
|
resp = JSON.unmarshal(str(raw.content, UTF_8), AccessTokenResponse)
|
||
|
|
||
|
if not resp.success():
|
||
|
raise ObtainAccessTokenException("obtain isv tenant access token failed", resp.code, resp.msg)
|
||
|
|
||
|
# 写缓存
|
||
|
token = resp.tenant_access_token
|
||
|
expire = time.time() + resp.expire - 10 * 60 # 提前10分钟过期
|
||
|
TokenManager.cache.set(cache_key, token, int(expire))
|
||
|
|
||
|
return token
|