企业出于安全考虑,需要在修改功能或登录密级较高的页面时,对成员进行二次身份校验
企业需要双因子认证时,可以怎么操作?
该组件仅适用于私有化WPS365版本
1. 方案概述
一般来讲,用户登录的安全认证分为两种:
- 单因子认证:用户只需提供一种认证因子来登录,通常是账号密码、微信扫码、短信验证码等。
- 双因子认证:用户需要提供两种不同认证因子来登录,通常是账密+其它形式的身份验证,其他形式比如短信验证码、安全令牌等,具体选择通过后台配置实现。
文档中心使用的是单因子认证的方式。
出于安全考虑,企业需要在修改定制应用功能前,比如修改消息审计、全局配置前。
或登录密级较高的页面时,对成员进行二次身份校验。
针对这种情况,我们可以使用文档中心管理后台的开放能力,定制双因子认证
| 实现效果 | 用户登录管理后台时,页面会跳出窗口,提醒用户绑定二次认证。![]() |
| 支持端 | 文档中心管理后台 |
| 涉及接口 | 获取当前会话信息 |
| 版本限制 | 版本24-12a(含)以上 |
| 操作系统限制 | 支持X86、XC |
2. 扩展应用对接
👉接口依赖
扩展应用中选择应用依赖,添加对应的接口依赖

根据接口文档,选择对应云文档V7所需依赖的接口

👉接口能力
在扩展应用中新建独立服务型组件,选择接口能力并新增API,

根据弹框中提示信息进行接口填写,请求方法GET,网关类型为c或proxy网关

👉接口详情
参考对应的接口文档
接口类型:365api内部网关
| Method | GET |
|---|---|
| Path | /v7/sessions/current |
| 网关 | 365api内部网关 |
| 认证 | kso_token或者access_token |
| Request | 见下方代码块 |
| Response | 见下方代码块 |
Request:
{
"with_detail": boolean
}
1
2
3
Response:
{
"data": {
"account": "string",
"avatar": "string",
"company_id": "string",
"ctime": 0,
"gender": {},
"login_mode": "string",
"multi_factor_auth": true,
"nick_name": "string",
"regtime": 0,
"role": {},
"status": {},
"user_id": "string"
},
"code": 0,
"more": {},
"msg": "string"
}
👉演示效果
kso_token鉴权方式
💡 提示
365api内部网关支持通过kso_token方式直接调用,kso_token可以通过proxy网关将前端的cookie转为kso_token
// 调用云文档获取用户信息
func (u *UserInfoService) GetUserInfo(token string) (*interApiModal.UserInfo, error) {
host := config.GlobalConfig.ECIS_HOST
url := host + "/v7/sessions/current?with_detail=true"
header := map[string]string{
"X-Kso-Token": token,
}
res, err := util.Get(url, header)
if err != nil {
log.Info("获取用户信息网络请求错误:", errors.Any("err", err))
return nil, err
}
if res != nil && res.Body != nil {
defer res.Body.Close()
}
var respBody []byte
if res.StatusCode != 200 {
if res.Body != nil {
respBody, _ =https://v7.wpseco.cn/c/manage/docs#/appDocs/wps365.open.docs/%E6%9C%8D%E5%8A%A1%E7%AB%AF/%E8%AE%A4%E8%AF%81%E4%B8%8E%E6%8E%88%E6%9D%83/%E8%8E%B7%E5%8F%96%E8%AE%BF%E9%97%AE%E5%87%AD%E8%AF%81/%E8%8E%B7%E5%8F%96%E8%87%AA%E5%BB%BA%E5%BA%94%E7%94%A8%E7%9A%84%E7%A7%9F%E6%88%B7access_tokehttps://v7.wpseco.cn/c/manage/docs#/appDocs/wps365.open.docs/%E6%9C%8D%E5%8A%A1%E7%AB%AF/%E8%AE%A4%E8%AF%81%E4%B8%8E%E6%8E%88%E6%9D%83/%E8%8E%B7%E5%8F%96%E8%AE%BF%E9%97%AE%E5%87%AD%E8%AF%81/%E8%8E%B7%E5%8F%96%E8%87%AA%E5%BB%BA%E5%BA%94%E7%94%A8%E7%9A%84%E7%A7%9F%E6%88%B7access_tokenio.ReadAll(res.Body)
log.Info("状态码错误:", errors.Any("err", string(respBody)))
}
return nil, fmt.Errorf("获取用户信息网络请求失败")
}
respBody, err = io.ReadAll(res.Body)
if err != nil {
log.Info("获取用户信息读取流错误:", errors.Any("err", err))
return nil, err
}
v7UserInfo := &V7UserInfoRes{}
err = json.Unmarshal(respBody, v7UserInfo)
if err != nil {
log.Info("获取用户信息转json错误:", errors.Any("err", err))
return nil, err
}
if v7UserInfo.Code != 0 {
log.Info("获取用户信息错误:", errors.Any("err", v7UserInfo.Data))
return nil, fmt.Errorf("获取用户信息失败")
}
return &v7UserInfo.Data, nil
}
access_token鉴权方式
// 获取acc_token
wps365Token, err := auth.NewWps365AuthTokenCache().GetAccessToken(config.GlobalConfig.AK, config.GlobalConfig.SK, companyId)
if err != nil {
log.Info("获取wps365Token失败", errors.String("error", err.Error()))
return nil, err
}
// 获取KSO-1签名
ksoSignService, _ := auth.NewKsoSign(config.GlobalConfig.AK, config.GlobalConfig.SK)
ksoSign, err := ksoSignService.KSO1Sign(request, jsonData)
if err != nil {
log.Info("获取KSO-1签名失败", errors.String("error", err.Error()))
return nil, err
}
识别双因子认证
multi_factor_auth
根据multi_factor_auth字段来判断双因子认证
- multi_factor_auth为null,则说明未开启双因子认证
- multi_factor_auth为true,则说明开启双因子认证且用户已经双因子认证通过
- multi_factor_auth为false,则说明开启双因子认证且用户未通过双因子认证
