APP下载

数字校园下基于单点登录的企业微信无感登录系统实现

2023-04-07梁方勇陈桂强

中国新技术新产品 2023年1期
关键词:无感单点调用

梁方勇 陈桂强

(华中师范大学,湖北 武汉 430079)

0 引言

随着信息技术和移动互联网的快速发展,尤其是微信、企业微信、微信公众平台的广泛应用,各高校均在大力推进数字校园建设,并依托企业微信、微信公众号等平台将各业务系统集成到平台中,为广大师生提供便捷的移动互联服务。在PC 时代,各高校一般通过单点登录(SSO)实现统一身份认证,需要输入统一的用户名和密码,根据权限进入各自的业务系统。在移动互联时代,人们已经习惯利用移动互联平台快速获取信息、进行移动办公。一方面,如果使用传统技术登录OA 等移动端业务系统,需要扫码二维码或凭用户名、密码登录,操作体验不够便捷。另一方面,各单位业务系统已经实现了PC 端的单点登录,拥有较好的基础,需要通过技术手段迁移到移动端,实现移动端的身份认证。

在企业微信平台下,通过系统设计和技术研发,将企业微信的OAuth 身份认证功能与单点登录(SSO)中的CAS 认证有机融合,实现无感登录,即无须输入用户名和密码即可登录企业微信平台,并根据用户权限访问不同的业务系统,有效减轻使用人员记忆密码的负担,提升用户使用体验,提高用户身份认证的安全性和便利性,已成为当前高校数字校园移动互联系统设计中需要解决的重要问题。基于这样一种设想,该文通过具体案例,研究探索该功能的实现路径,该系统设计方案同时适用于微信公众平台、微信小程序与SSO集成融合,也可为其他高校的数字校园建设提供一定的参考借鉴。

1 单点登录的应用场景及认证原理

各单位的信息化建设是一个循序渐进的过程,在建设中根据各种需要构建了相应的信息系统,并形成了各自独立的用户认证体系。如果不引入单一用户登录的解决方案,工作人员需要记忆各类系统的用户名和密码,用户容易混淆或者忘记登录信息[1],严重影响工作效率。

单点登录(Single Sign On),简称为SSO,为实现用户统一身份认证的重要组成部分[2],是比较流行的企业业务整合的解决方案之一。通过应用SSO 技术可实现登录一次访问所有应用系统。

SSO 一般将开源软件CAS 作为基础平台,包括CAS Client 和CAS Server 两个部分。CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server;CAS Server 主要负责对用户的认证工作。CAS 认证过程如图1 所示。

图1 CAS 认证过程

图1 说明了CAS 的认证过程[3],共分为6 步。第一步,用户通过客户端浏览器请求访问应用;第二步,CAS Client将该请求重定向到CAS Server;第三步,用户输入信息,CAS Server 进行认证;第四步,认证成功后CAS Server 会产生一个随机Service Ticket;第五步,验证票据。CAS Server 验证Service Ticket 的合法性;第六步,返回用户信息。CAS Server 验证票据通过后,返回用户认证结果信息。

2 企业微信平台实现无感登录的原理与流程

企业微信平台实现无感登录的本质是对访问者身份信息进行认证[4]。根据微信开发者文档,获取用户身份信息实现单点登录可分为5 步。第一步获取授权标识code。可以通过前端网页加载一个url,调用企业微信接口获取授权标识code;第二步获取accessToken。它是企业微信或微信公众号的唯一接口调用凭据,可以使用corpId 和Secret 调用接口来获取accessToken,调用各类接口时都必须使用accessToken;第三步,获取用户ID(userid)。通过code 和accessToken 调用接口获取用户信息userid;第四步通过userid 获取用户信息。通过userid 和accessToken 调用接口获取用户信息userinfo;第五步是与单点登录系统进行集成融合。整个流程如图2 所示。

图2 数字校园下基于单点登录的企业微信无感登录系统的流程图

3 系统设计

3.1 系统整体架构

数字校园下基于单点登录的企业微信无感登录系统的整体架构如图3 所示。首先,用户登录企业微信或微信公众平台。其次,通过后台调用接口取得userid,并对该userid进行身份验证。最后,验证通过后集成单点登录系统,即可根据权限进入不同业务系统。

图3 系统整体架构图

3.2 基于单点登录的企业微信无感登录系统实例参考

该文以基于单点登录的企业微信无感登录系统为例,根据上述系统架构及流程设计,各模块的核心Java 代码如下。

3.2.1 企业微信平台登录模块代码

企业微信平台登录实质上就是链接到一个Web 页面地址,例如本系统中为http://hrzm.ccnu.edu.cn/login.jsp,通过在登录login.jsp 页面中添加JavaScript 代码,JavaScript 程序就会开始检测,如果客户端为微信平台,则跳转到企业微信接口域,此接口域内含重定向的服务器地址url。前端login.jsp 页面核心代码如下:

<SCRIPT LANGUAGE="JavaScript">

function init(){

var weixin=is_weixin();//判断是否微信平台

if(weixin){

window.location="https://open.weixin.qq.com/connect/oauth2/authorize?appid=corpid&redirect_uri=http%3A%2F%2fhrzm.ccnu.edu.cn%2FloginWxOauth2Action.do&response_type=code&scope=snsapi_base&state=#wechat_redirect。";//进 入移动端微信登录}

else{

window.location="/login.do";//进入PC 端单点登录

}}

init();

</SCRIPT>

跳转成功后即转发服务器地址url,同时地址中会自动带上授权标识code,在后台可以通过返回的url 获得授权标识code,获得授权标识code 的Java 代码如下:

String code = request.getParameter(“code”);

此模块的流程如图4 所示。

图4 登录模块获取授权标识code 流程图

3.2.2 获取accessToken 模块代码

根据企业号corpID和Secret调用企业微信接口来获取accessToken。核心Java 代码[5]如下:

/** * 获取AccessToken

*/

public static AccessToken getAccessToken(){

AccessToken token = new AccessToken();

try{

String url="https://gyapi.weixin.gg.com/cgi-bin/gettoken?corpid="+ID+"&corpsecret ="+SECRET ;//ID 和SECRET 为static final 变量,可在微信公众平台开发者中心页面获得

JSONObject jsObj = doGetStr(url);//解析url

if(jsObj!=null){

token.setAccessToken(jsObj.getString("access_token"));//设置access_token

token.setExpiresIn(jsObj.getInt("expires_in"));// 设 置access_token 的有效期

return token;}

}catch (Exception e) {token =null;}

return null;

}

3.2.3 获取用户ID 模块代码

根据获取的code 和accessToken 调用企业微信接口获取用户信息userid。核心Java 代码如下:

/** * 根据AccessToken 和code 获取用户id

*/

public static String getUserID(String access_token, String code){

String UserId = "";

String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+access_token+"&code="+code;

JSONObject jsObj= doGetStr(url);//解析url if(jsObj!=null){

UserId = jsObj.getString("UserId");}return UserId;

}

取得UserID 后,存储到request 中,并转发单点登录模块。

request.setAttribute("UserId", UserId);

request.getRequestDispatcher("/sso.do").forward(request,response);

3.2.4 根据用户ID 获取用户信息

通过获取的userid 和accessToken 调用接口获取用户信息userinfo,可以得到用户的mobile、e-mail、name 等信息。核心Java 代码如下:

/** * 根据AccessToken 和userid 获取用户信息

*/

public static JSONObject getUserID(String access_token, String userid) {

String url = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token="+access_token+"&userid="+userid;

JSONObject UserInfo = doGetStr(url);

if(UserInfo !=null){return UserInfo;}

}

3.2.5 集成单点登录系统代码

从request 中取得userid 后,会进入正常的表单登录认证的AuthenticationHandler 中,需要在执行正常的认证逻辑之前插入企业微信认证逻辑。CAS 服务器则保存用户凭证Principal,通过验证用户凭证即可访问各业务系统。核心Java代码如下:

String UserId=request.getAttribute("UserId");

if(!UserId.notEqual(null)&&!UserId.notEqual(""){

credential.setUsername(UserId);

Return createHandlerResult(credential,this.principleFactory.createPrincipal(credential.getUsername()),null);

}

//验证用户凭证代码

AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();

String userName = principal.getName();//通过用户凭证获取username

最后通过取得的userName 得到用户权限,进入不同的业务系统,如此即实现了基于单点登录的企业微信无感登录系统。整个登录过程在用户层面是感受不到登录过程的,把便利留给了用户,极大地提升了用户体验。

3.3 环境搭建及配置

系统采用B/S 架构,运行环境选择安装jdk1.7.0_72,Web服务器采用Apache Tomcat7.0.100,数据库为Oracle 10,操作系统为Microsoft Sever,开发语言为Java、Jsp、HTML、JavaScript。以及需要下载安装第三方库,包括struts 库、requests 库、json 库和单点登录SSO 依赖包cas-server-3.5.1+cas-client-3.2.1 等。

4 安全性分析

企业微信平台使用OAuth2.0 标准实施安全验证。OAuth2.0 是一个关于授权(authorization)的开放网络标准,OAuth2.0 中使用的授权码模式(authorization code)是功能最完整、流程最严密的授权模式,也是最安全的一种模式。这使集成单点登录系统后的整个系统的安全性也得到了很好的保障。

5 结语

该文提出了Java 语言环境中数字校园下基于单点登录的企业微信无感登录系统,通过将企业微信的OAuth 身份认证与单点登录(SSO)中的CAS 认证相融合,较好地解决了企业微信平台下登录多个业务系统时无须输入用户名和密码的问题,有效减轻了使用人员记忆密码的负担,对提升用户使用体验有较大意义,同时应用OAuth2.0安全机制也保障了系统的安全性。实例验证标明,该无感登录系统设计方案亦适用于微信公众号等平台下与业务系统的集成,具有较强的拓展性。

猜你喜欢

无感单点调用
来翠园体验无感加油
历元间载波相位差分的GPS/BDS精密单点测速算法
北京P+R停车场无感支付方案探讨
金溢科技加速助推ETC无感加油
核电项目物项调用管理的应用研究
超薄异型坯连铸机非平衡单点浇铸实践与分析
四大行纷纷推出无感支付产品
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
数字电视地面传输用单频网与单点发射的效果比较