统一身份管理平台IAM单点登录流程及第三方接口设计方案
作者:互联网
#统一身份管理平台IAM
很多企业都有多个办公系统,账号、密码、角色、权限等均需要单独设置且不能实现统一管理。
统一身份认证管理系统IAM,我认为有以下三个优点:
- 建立统一的用户管理、身份配给和身份认证体系,实现用户身份和权限的动态同步。
- 实现全部办公系统(应用)的单点登录(B/S架构)或密码认证登录(C/S架构)。
- 加强信息安全预警和审计,提高系统可用性、安全性和用户使用便携度。
即:一个账号打通企业内部多个办公系统,覆盖多场景管控,支持部门,角色,人员维度授权。
#统一身份管理平台IAM单点登录流程图(B/S架构)
使用范围:需要实现单点登录,使用统一身份管理平台的登录页面,并能发送https请求的第三方系统,简单总结有如下四个步骤:
- authorize接口,请求用户授权,完成后跳转第三方系统。
- authorization_code接口,根据code获取授权Token。
- getUserInfo接口,根据Token获取用户信息。
- logout接口,注销登录。
本文将介绍统一身份认证平台IAM常用单点登录第三方接口设计。
#1、请求用户授权,完成后跳转第三方系统,网页设计
网页接口说明:
请求类型 | GET/WEB网页访问 | |||||||||||||||
请求示例 | https://iam.xxxxx.com:8080/idp/oauth2/authorize?redirect_uri=https://www.baidu.com&state=xxxx&client_id=xxxxx&response_type=code | |||||||||||||||
参数说明 |
| |||||||||||||||
处理逻辑 | 1、判断参数; 2、验证client_id是否有效; 3、校验redirect_uri; 4、显示认证授权页面; 5、验证身份后页面跳转至redirect_uri并附有参数授权码(写入Cookie中)。 | |||||||||||||||
返回值 | 以上文中的回调地址为百度为例,授权完成后会跳转至https://www.baidu.com/?code=83953d36e2ae7c8903c6b589c8998670&state=xxxxx,携带参数code和state。 |
实际操作:
WEB网页登录授权界面(GET请求)
登录成功跳转界面,携带参数code和state
#2、根据code获取Token授权第三方接口设计
通过上文code即可以获取access_token和refresh_token,当access_token过期时,可以通过refresh_token重新获取新的access_token,保持登陆状态。
接口说明:
请求类型 | POST | |||||||||||||||
请求示例 | https://iam.xxxxx.com:8080/idp/oauth2/getToken?client_id=xxxxxx&grant_type=authorization_code&code=xxxxxx&client_secret=xxxxxx | |||||||||||||||
参数说明 |
| |||||||||||||||
处理逻辑 | 1、验证参数有效性; 2、验证授权码有效性及范围; 3、根据以上判断、验证及认证结果返回JSON数据。 | |||||||||||||||
返回值 | 类型JSON,正确返回值: { "access_token": "5e717f5eda086269706a407e3764092a", "refresh_token": "fb6e93b627a1a93679251f605097503c", "uid": "20210311135809626-B457-4E410EFEB", "expires_in": 1500 } |
获取Token-POST请求接口示例代码:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;
public class getToken {
public static String getToken(String url){
BasicHttpParams http = new BasicHttpParams();
//设置请求超时1秒钟
HttpConnectionParams.setConnectionTimeout(http,1000);
//设置等待数据超时时间1秒钟
HttpConnectionParams.setSoTimeout(http,1000);
HttpClient client = new DefaultHttpClient(http);
String jsonresult = "";
try {
//Http Post请求
HttpPost post = new HttpPost(url);
HttpResponse response = client.execute(post);
//获取返回参数
HttpEntity entity =response.getEntity();
jsonresult = EntityUtils.toString(entity,"utf-8");
}catch (Exception ex){
ex.printStackTrace();
}finally {
client.getConnectionManager().shutdown();
}
return jsonresult;
}
public static void main(String[] args) {
String url = "https://iam.xxxxx.com:8080/idp/oauth2/getToken?client_id=SE&grant_type=authorization_code&code=dc605a7a6389b0898f653b4895359071&client_secret=6f369937851b4669ad66b41257b9a902";
//输出返回JSON字符串
System.out.println(getToken(url));
}
}
#3、根据Token获取用户信息第三方接口设计
通过上文获取的access_token即可访问用户接口,获取用户信息,实现该用户在第三方系统(应用)上的免密登录。
接口说明:
请求类型 | GET | |||||||||
请求示例 | https://iam.xxxxx.com:8080/idp/oauth2/getUserInfo?access_token=xxxxx&client_id=xxxxx | |||||||||
参数说明 |
| |||||||||
处理逻辑 | 1、验证参数有效性; 2、根据应用配置的属性权限列表,查询用户信息返回; 3、根据以上判断、验证及认证结果返回JSON数据。 | |||||||||
返回值 | 类型JSON字符串,正确返回值: { "orgNamePath": "/人事处", "spRoleList": [], "uid": "20210311135809626-B457-4E410EFEB", "mail": "liming@qq.com", "orgCodePath": "W000001", "displayName": "李明", "loginName": "E012345678", "mobile": "13999999999", "orgNumber": "P00000000", "employeeNumber": null } |
获取用户信息-GET请求接口示例代码:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;
public class getUserInfo {
public static String getToken(String url){
BasicHttpParams http = new BasicHttpParams();
//设置请求超时1秒钟
HttpConnectionParams.setConnectionTimeout(http,1000);
//设置等待数据超时时间1秒钟
HttpConnectionParams.setSoTimeout(http,1000);
HttpClient client = new DefaultHttpClient(http);
String jsonresult = "";
try {
//Http Get请求
HttpGet get = new HttpGet(url);
HttpResponse response = client.execute(get);
//获取返回参数
HttpEntity entity =response.getEntity();
jsonresult = EntityUtils.toString(entity,"utf-8");
}catch (Exception ex){
ex.printStackTrace();
}finally {
client.getConnectionManager().shutdown();
}
return jsonresult;
}
public static void main(String[] args) {
String url = "https://iam.xxxxx.com:8080/idp/oauth2/getUserInfo?access_token=xxxxx&client_id=xxxxx";
//输出返回JSON字符串
System.out.println(getToken(url));
}
}
#4、Logout注销登录,完成后跳转,网页设计
第三方应用系统请求IAM认证中心全局退出URL,认证中心销毁用户全局会话,并调用该应用销毁会话URL,该地址需调用回收授权接口实现清除当前oauth票据及销毁应用本地会话的功能。
流程图如下:
网页接口说明:
请求类型 | GET/WEB网页访问 | ||||||||||||
请求示例 | https://iam.xxxxx.com:8080/idp/profile/OAUTH2/Redirect/GLO?redirctToUrl=https://www.baidu.com&redirectToLogin=true&entityId=xxxxx | ||||||||||||
参数说明 |
| ||||||||||||
处理逻辑 | 1、判断参数; 2、根据以上判断、验证及认证结果返回JSON数据。 | ||||||||||||
返回值 | 以上文中的回调地址为百度为例,注销后会跳转至https://www.baidu.com,如果跳转为false,则会停留到IAM注销页面https://iam.xxxxx.com:8080/idp/http/logout.do |
标签:IAM,code,单点,org,client,设计方案,import,apache,http 来源: https://blog.csdn.net/m0_59562547/article/details/121093724