学校有多套不同厂商、不同时期上线的独立系统,学生、教职工每个人都要记多个系统的密码、时间久了容易忘记。假设师生只需记住一个平台(如润岚RunLan智慧校园平台)的账号密码,登录这个平台后就可直接跳转到第三方系统,并能自动完成登录,这样师生就不用记多个系统地址和账号密码,以提升用户体验。此类场景或问题的解决方案就是“单点登录SSO”。
润岚RunLan平台提供的单点登录SSO整合,支持两种方式,推荐学校使用方式一:
方式一:以RunLan平台为中心,将其它三方应用整合到RunLan平台中,在RunLan中添加三方系统链接,实现登录RunLan后,可直接点三方系统链接完成跳转和自动登录。
方式二:以第三方平台为中心,将RunLan平台整合到第三方平台中(作为第三方平台的一个应用),学生或教师在在第三方平台登录后,点击RunLan平台链接就可完成跳转和自动登录到RunLan个人门户。
提醒:目前RunLan仅支持B/S架构(通过浏览器方式使用的系统)系统进行SSO对接,需要第三方按RunLan提供的接口进行开发。
实现效果:假设待整合接入的第三方系统为“图书管理系统”,要求在用户登录润岚RunLan平台后的个人门户中可直接点击“图书管理系统”链接,直接跳转到“图书管理系统”并完成自动登录。整个整合步骤如下:
第一步:第三方系统厂商需要根据RunLan的接口,先通过调用RunLan平台接口(如学生、教职工基础数据)获取用户基础数据,以便后续整合工作的顺利开展。
第二步:第三方根据待接入系统采用的技术路线,按照润岚提供的接口要求进行接入。第三方需采用RESTFul风格实现以下接口供RunLan平台使用,注意接口的请求参数及返回参数名称请与接口描述的参数名称保持一致,避免导致RunLan平台无法正确接收到参数值。
1. 提供单点登陆的url地址 oauthLogin
接口说明:用于RunLan平台将当前登录用户信息传递到三方系统完成用户认证。
请求方式:GET
请求参数:
| 参数 | 含义 |
|---|---|
| code | 一次性校验码,使用后立即失效 |
| secretID | 润岚RunLan平台提供给厂商的唯一编号ID |
签名说明:
为了更好的保证润岚平台传递给三方平台参数值的安全性,参数code只能使用一次,使用后立即失效,第三方平台接收到code后,按以下2中的方法向润岚RunLan平台接口请求获取access_token。
2. 调用接口获取access_token
接口说明:用于获取润岚RunLan平台access_token。
请求方式:GET
请求参数:
| 参数 | 含义 |
|---|---|
| code | 一次性校验码,使用后立即失效 |
| secretID | 润岚RunLan平台提供给厂商的唯一编号ID |
| time | 当前时间戳(10位),以秒为单位的时间戳,如:1706773187 |
| sign | 签名,由code+secretID+time+secretkey进行加密构成。具体加密算法由咨询我司项目服务专员。 |
返回值:
第一步:三方API接口授权,授权“单点登录整合”这个场景
第二步:调用接口获取用于sso的token(确保双方的登录账号一致,若双方的登录账号不一致,则需先解决账号一致的问题),接口说明如下:
接口地址: http://[平台访问地址]/identification/third-sso/token?version=V1.0
请求方式:POST
请求参数:
| 参数名称 | 是否必选 | 类型 | 说明 |
|---|---|---|---|
| accessKey | 是 | String | 凭证key,即润岚平台提供的client_id |
| identityType | 是 | String | 固定值 “2” |
| identity | 是 | String | 当前登录用户的账号 |
| nonce | 是 | String | 随机uuid |
| timestamp | 是 | String | 时间戳(发起请求的时间毫秒值) |
| sign | 是 | String | 签名内容,签名说明请看下面说明 |
返回说明:
{ "status": 200, "message": "ok", "result": { "access_token": "xxxxx" }}签名说明:
签名算法:HMAC-SHA1、Base64
签名参数:accessKey,identityType,identity,nonce,timestamp,按照固定格式拼接的字符串,进行算法签名。
格式为:“accessKey=${accessKey}&identityType=${identityType}&identity=${identity}&nonce=${nonce}×tamp=${timestamp}”
签名逻辑:
java版本
js版本
var accessKey = "access-key-abc";
var secret = "test-secret-abc@123"; // 私钥
var identityType = "2";
var identity = "test";
var timestamp = "1680595615765"; // 毫秒时间戳
var nonce = "nonece-456456489643dd251313"; // 唯一
// 字符串进行md5加密
var str = `accessKey=${accessKey}&identityType=${identityType}&identity=${identity}&nonce=${nonce}×tamp=${timestamp}`;
var sign = CryptoJS.HmacSHA1(str, secret).toString(CryptoJS.enc.Base64);
console.log("签名结果是:" + sign); // 签名结果是:GK1lEbtWWlbc3zMbiO3nYlgkwMM=
String accessKey = "access-key-abc";
String secret = "test-secret-abc@123"; // 私钥
String identityType = "2";
String identity = "test";
String timestamp = "1680595615765"; // 毫秒时间戳
String nonce = "nonece-456456489643dd251313"; // 唯一
String str = MessageFormat.format("accessKey={0}&identityType={1}&identity={2}&nonce={3}×tamp={4}"
, accessKey,loginName, loginType, successURL, timestamp);
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
byte[] signData = mac.doFinal(str.getBytes(StandardCharsets.UTF_8));
String sign = Base64.getEncoder().encodeToString(signData);
System.out.println("签名结果是:" + sign); // 签名结果是:GK1lEbtWWlbc3zMbiO3nYlgkwMM=
第三步:访问url进行sso跳转,url说明如下:
http://[平台访问地址]/identification/third-sso/redirect?version=V1.0&access_token=xxxxxx
返回说明:
- 验证成功,跳转到RunLan平台首页。- 验证失败,错误提示页面。