- 服务描述
- 主要API
- API /[admin|internal]/tfa/tokens/register 注册token
- API /[admin|internal]/tfa/tokens/update 删除或更新token
- API /internal/tfa/tokens/request 请求token
- API /internal/tfa/tokens/inquire 查询token
- API /internal/tfa/otp/request 创建OTP
- API /internal/tfa/otp/verify 校验SMS/HWK/SWK OTP
- API /v1/internal/tfa/users/retrieve 查询TFA用户和token信息
- API /v1/internal/tfa/users/create 创建tfa用户
- API /v1/admin/tfa/users/update 更新tfa用户信息
- API /v1/internal/tfa/counter/update 更新用户token重试次数
- API POST /internal/token-proxy/soft-tokens/deactivate
- API POST /internal/token-proxy/hard-tokens/suspend
- API POST /v1/soft-tokens/otp/validate
- Batch JOB
- 主要业务流程
- 主要架构设计方案
- 主要数据库设计
- 遇到的问题和解决方案
- 优缺点和改进方案分析,业界对比
服务描述
该服务主要负责授权token的管理,token类型包括SMS OTP,SWK, HWK,FIDO,常用操作包括token的查询,创建等。
ms-base-token-management-corp 负责CORP的token管理的服务。
ms-token-management-command 负责与token管理相关的业务的domain服务。
主要API
API /[admin|internal]/tfa/tokens/register 注册token
admin:用于backoffice
internal:用于用户注册SMS/HWK token。
API /[admin|internal]/tfa/tokens/update 删除或更新token
dmin:用于backoffice删除SMS/HWK token。
internal:用于用户删除或者更新SMS token。
API /internal/tfa/tokens/request 请求token
步骤:
1. 校验destinationInfo,tokenNo。
2. 根据domain,查询tokenPolicy,通过本地缓存或DB TfaPolicy。获得authzAllowedList、CASEnable、TokenModel。
3. 根据userId和domain,查询TfaUser表,获取用户信息。
4. HWK,调用CAS获取用户和token信息。
如果用户不存在,则创建CAS用户。
如果用户存在且状态是revoke,则硬删除用户,重新创建用户记录。
如果用户存在且状态是block或lock,抛出异常。
如果用户存在且状态是active,do nothing。
保存到t_tfa_token表。
API /internal/tfa/tokens/inquire 查询token
根据tokenno和userId查询token。
步骤:
1. 校验userId,tokenNo。
2. 根据domain,查询tokenPolicy,通过本地缓存或DB TfaPolicy。
3. 根据tokenType,查询用户和token信息。
HWK,查CAS。如果用户状态是block,更新本地数据库。
SWK,查SoftTokenUser表。
4. 查询user和token level的当前计数。
5. 查询TfaToken表,返回token信息。
6. 查询TfaUser表,返回用户信息。根据之前获取的用户信息,更新TfaUser表。
API /internal/tfa/otp/request 创建OTP
创建OTP。
API /internal/tfa/otp/verify 校验SMS/HWK/SWK OTP
SWK OTP: cust-auth → token-mgn/otp/verify → ms-crypto/verify-otp → New HSM
ms-crypto从请求体获取Token seed,用HSM解密后用token seed生成OTP,和请求体的OTP校验。
API /v1/internal/tfa/users/retrieve 查询TFA用户和token信息
在retrieve()方法中调用了start(tfaUserRetrieveProperties.getDefaultChain(), context)方法。
TfaUserRetrieveProperties是接口/users/retrieve对应的配置文件,其中getDefaultChain()定义了默认的责任链的每个ChainedProcessor具体实现类。
start()方法定义了责任链的处理:依次调用每个ChainedProcessor具体实现类的chain()方法。直到全部处理完成,或者发生ChainBreak异常。
TfaUserRetrieveGetPolicyProcessor
查询缓存和t_tfa_policy表。
根据配置文件设置channel。
TfaUserRetrieveRetrieveCASTokenProcessor
调用CAS的/api/users接口。
如果返回casUser和token都存在,调用CAS的/api/devices接口查询详细信息。
TfaUserRetrieveRetrieveUserProcessor
查询t_tfa_user表。如果tfaUser不存在而且casUser存在,则创建tfaUser。
TfaUserRetrieveRetrieveSoftTokenProcessor
查询soft_token_usr表,通过userId,channel,tsn,返回user的activated soft token信息,包括device info,otp token,pki token。
TfaUserRetrieveComputeRemainCounterProcessor
通过tfa policy,返回最大重试次数。
TfaUserRetrieveRetrieveTokenProcessor
查询t_tfa_token表,通过userId,channel,返回token list。并同步。
API /v1/internal/tfa/users/create 创建tfa用户
创建用户并存储在本地DB,调用CAS创建用户。
TfaUserCreateGetPolicyProcessor
查询缓存和t_tfa_policy表,通过channel,policy code。设置CAS enable。
TfaUserCreateChkAndCreateUserProcessor
查询t_tfa_user表。如果user不存在,则新增表记录。
TfaUserCreateCreateCasUserProcessor
调用CAS的/api/users接口。如果用户存在则调用CAS接口删除用户。调用CAS接口创建用户。
API /v1/admin/tfa/users/update 更新tfa用户信息
更新用户在本地DB中的信息,调用CAS更新用户信息。
TfaUserGetPolicyProcessor
查询缓存和t_tfa_policy表,通过channel id 和policy id。
TfaUserValidateRequestProcessor
查询t_tfa_user表,通过user ID和domain。校验用户状态
TfaUserChkAndDoActionProcessor
根据请求参数,更新t_tfa_user表。
API /v1/internal/tfa/counter/update 更新用户token重试次数
TfaCounterUpdateChkAndGetPolicyProcessor
查询缓存和t_tfa_policy表,通过channel,返回count level和最大次数。
TfaCounterUpdateValidateRequestProcessor
校验request,包括token type。
查询t_tfa_user表。
TfaCounterUpdateUpdateUserCounterProcessor
更新t_tfa_user表counter最新次数。
TfaCounterUpdateUpdateTokenCounterProcessor
更新t_tfa_token表。
API POST /internal/token-proxy/soft-tokens/deactivate
用于Kill Switch。
API POST /internal/token-proxy/hard-tokens/suspend
用于Kill Switch。
API POST /v1/soft-tokens/otp/validate
校验soft token。
传参tokenSerialNum、tokenAppId、dfpHash、otp、challenge、challenge2。
步骤:
同tfa/otp/verify,复用TokenValidationService.validatetOtp()。
SWK OTP: cust-auth → token-mgn/otp/verify → ms-crypto/verify-otp → New HSM
ms-crypto从请求体获取Token seed,用HSM解密后用token seed生成OTP,和请求体的OTP校验。
Batch JOB
每天下午执行,查询最近2天的tfa-softtoken数据,去重后给用户发消息。
