#统一身份管理平台IAM
很多企业都有多个办公系统,账号、密码、角色、权限等均需要单独设置且不能实现统一管理。
统一身份认证管理系统IAM,我认为有以下三个优点:
建立统一的用户管理、身份配给和身份认证体系,实现用户身份和权限的动态同步。实现全部办公系统(应用)的单点登录(B/S架构)或密码认证登录(C/S架构)。加强信息安全预警和审计,提高系统可用性、安全性和用户使用便携度。
即:一个账号打通企业内部多个办公系统,覆盖多场景管控,支持部门,角色,人员维度授权。
#统一身份管理平台IAM单点登录流程图(B/S架构)
使用范围:需要实现单点登录,使用统一身份管理平台的登录页面,并能发送https请求的第三方系统,简单总结有如下四个步骤:
authorize接口,请求用户授权,完成后跳转第三方系统。authorization_code接口,根据code获取授权Token。getUserInfo接口,根据Token获取用户信息。logout接口,注销登录。
本文将介绍统一身份认证平台IAM常用单点登录第三方接口设计。
#1、请求用户授权,完成后跳转第三方系统,网页设计
网页接口说明:
2、验证client_id是否有效;
3、校验redirect_uri;
4、显示认证授权页面;
5、验证身份后页面跳转至redirect_uri并附有参数授权码(写入Cookie中)。
实际操作:
WEB网页登录授权界面(GET请求)
登录成功跳转界面,携带参数code和state
#2、根据code获取Token授权第三方接口设计
通过上文code即可以获取access_token和refresh_token,当access_token过期时,可以通过refresh_token重新获取新的access_token,保持登陆状态。
接口说明:
2、验证授权码有效性及范围;
3、根据以上判断、验证及认证结果返回JSON数据。
{
"access_token":"5e717f5eda086269706a407e3764092a",
"refresh_token":"fb6e93b627a1a93679251f605097503c",
"uid":"0311135809626-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 = ":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即可访问用户接口,获取用户信息,实现该用户在第三方系统(应用)上的免密登录。
接口说明:
2、根据应用配置的属性权限列表,查询用户信息返回;
3、根据以上判断、验证及认证结果返回JSON数据。
类型JSON字符串,正确返回值:
{
"orgNamePath":"/人事处",
"spRoleList":[],
"uid":"0311135809626-B457-4E410EFEB",
"mail":"liming@",
"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 = ":8080/idp/oauth2/getUserInfo?access_token=xxxxx&client_id=xxxxx";//输出返回JSON字符串System.out.println(getToken(url));}}
#4、Logout注销登录,完成后跳转,网页设计
第三方应用系统请求IAM认证中心全局退出URL,认证中心销毁用户全局会话,并调用该应用销毁会话URL,该地址需调用回收授权接口实现清除当前oauth票据及销毁应用本地会话的功能。
流程图如下:
网页接口说明:
2、根据以上判断、验证及认证结果返回JSON数据。