本帖最后由 杨童 于 2025-1-14 14:27 编辑
需求背景:某客户有自建的手机APP应用,已经集成了企微/钉钉的sdk,实现了一键拉起企微/钉钉APP认证的能力。现在需要在APP中集成零信任SDK,实现暴露面收缩。需要把零信任的认证融合到已有的企微/钉钉认证中,实现单点登录
方案思路概述: 在原本的企微/钉钉的oauth2认证流程中插入零信任sdk+https认证,使code传输过程经过sdk+http(s)认证透传,由零信任代理app和app服务器之间的交互,以此实现app客户端、零信任sdk、零信任服务端、app服务器之间的单点登录
1、钉钉/企微的认证逻辑分析:两者都是基于oauth2实现,客户APP原本的认证流程如下,和标准oauth2流程基本无差别 2、企微/钉钉的服务器、SDK接口文档如下 企微SDK本地认证接口说明 https://developer.work.weixin.qq.com/document/path/91194 企微获取access_token的说明 https://developer.work.weixin.qq.com/document/path/91039 企微获取基础用户信息说明 https://developer.work.weixin.qq.com/document/path/91023 企业微信获取详细用户信息说明 https://developer.work.weixin.qq.com/document/path/95833
钉钉SDK本地认证接口获取code说明 https://open.dingtalk.com/document/orgapp/jsapi-get-auth-code 钉钉获取access_token的接口说明 https://open.dingtalk.com/document/orgapp/obtain-the-access_token-of-an-internal-app 钉钉获取用户信息的接口说明 https://open.dingtalk.com/document/orgapp/obtain-the-userid-of-a-user-by-using-the-log-free
2、零信任认证逻辑分析:
2.1、零信任SDK认证逻辑分析:SDK集成到APP内部后,SDK本身提供了账号密码的填写接口,APP可以将账号、密码、短信验证码等标准字符或者是任意的字符,填写到SDK的用户名和密码栏目,然后SDK会将这些字段透传到零信任控制中心,控制中心通过识别这些信息进行认证或者找外部服务器进行认证
2.2、关于认证方式的选择:要把APP已有的认证流程中加入零信任的过程,只能使用http(s)认证,因为只有http(s)认证可以通过自定义http请求实现字段透传,将oauth2流程中的code、token进行透传交互,在认证流程中插入http(s)认证,零信任就可以介入整个认证流程,从而在流程中获取到认证结果和用户信息,实现零信任的同步上线。其他认证方式均无法实现此效果,只能http(s)认证
2.3、加入零信任sdk和http(s)认证后的交互流程图如下:
APP改造和零信任配置思路: 1、改造code传输逻辑:根据流程图可知,原本app从企微/钉钉获取到code之后,需要将code传给APP本身的认证服务器,改造后加入了零信任sdk,就需要改造把code传给sdk的认证接口,填写到用户名或者密码字段,以此来实现sdk将code透传到零信任服务端 这里需要将接口文档提供给app开发人员,让开发改造即可 https://bbs.sangfor.com.cn/atrustdeveloper/appsdk/android/android_sdk_username_password_auth.html 将code传到下图这个用户名或密码字段
2、零信任认证服务器配置:根据前期方案分析,零信任需要配置http(s)认证,来实现将sdk发来的code透传到后端APP认证服务器。此过程需要获取app认证服务器的回调接口格式要求,根据回调接口要求配置http(s)认证服务器 这里需要一线配置http(s)认证,根据app服务器的认证接口文档配置http(s)认证服务器,配置要点就是要实现将SDK通过账号密码字段传来的code透传到APP服务器的回调接口 配置参考如下,如果app是把code传到了用户名字段,字段(key)使用APP服务器要求即可,值(value)则直接使用内置变量{{user.username}}即可,具体根据app服务器要求配置,本文仅提供思路
3、APP服务器回调接口改造(可能涉及):由于之前app的认证服务器是从app客户端接收code和返回认证结果,现在对象变成了零信任服务端,服务器的响应报文需要满足两个条件 3.1、信息可读性:需要确保原本app服务器回复给app客户端的信息零信任能够解读,最好使用标准的json、xml格式(如果用其他如文本等隔世,需要通过响应数据预处理模块解决) 3.2、信息完整性:原本app服务器和客户端交互时肯定带有比如认证通过等字段,也可能带有用户名/组织架构等字段,如果有则零信任可以复用,如果没有则需要根据零信任的要求进行改造。 零信任要求响应报文中必须有比如用户名这种唯一标识和认证成功&失败标识字段,要确保响应报文中有这些信息,零信任服务端才能够识别到对应用户身份和透传到SDK提供给APP调用(手机号/组织架构等字段可以根据实际情况决定,非必须) 配置参考如下,零信任需要配置用户名映射,将app服务器返回的用户名字段解析给零信任本地,提供给零信任本地校验用户是否存在。扩展字段则根据需求(如果存在有app需要透传到app客户端的信息则使用)。认证成功条件根据返回信息判断配置即可。本文仅供参考
4、APP认证状态监听:原本APP客户端是直接和APP认证服务器交互获取认证结果,加入零信任SDK后,需要改造成监听SDK的认证结果接口,从SDK的认证接口中获取认证结果。同时如果有特殊的字段需要APP服务器通过零信任透传到客户端,也是通过此接口获取,如下图 |