统一身份管理平台IAM单点登录流程及第三方接口设计方案

#统一身份管理平台IAM

很多企业都有多个办公系统,账号、密码、角色、权限等均需要单独设置且不能实现统一管理。

统一身份认证管理系统IAM,我认为有以下三个优点:

  1. 建立统一的用户管理、身份配给和身份认证体系,实现用户身份和权限的动态同步。
  2. 实现全部办公系统(应用)的单点登录(B/S架构)或密码认证登录(C/S架构)。
  3. 加强信息安全预警和审计,提高系统可用性、安全性和用户使用便携度。

即:一个账号打通企业内部多个办公系统,覆盖多场景管控,支持部门,角色,人员维度授权。

#统一身份管理平台IAM单点登录流程图(B/S架构)

使用范围:需要实现单点登录,使用统一身份管理平台的登录页面,并能发送https请求的第三方系统,简单总结有如下四个步骤:

  1. authorize接口,请求用户授权,完成后跳转第三方系统。
  2. authorization_code接口,根据code获取授权Token。
  3. getUserInfo接口,根据Token获取用户信息。
  4. logout接口,注销登录。

统一身份管理平台IAM单点登录流程及第三方接口设计方案

本文将介绍统一身份认证平台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
参数说明
参数名 说明 描述
client_id 应用标识 客户端应用注册ID
redirect_uri 跳转地址 跳转地址(uri编码)
response_type 相应类型 code
state 任意值 用于保持请求和回调状态,可用于防止CSRF攻击

处理逻辑 1、判断参数;
2、验证client_id是否有效;
3、校验redirect_uri;
4、显示认证授权页面;
5、验证身份后页面跳转至redirect_uri并附有参数授权码(写入Cookie中)。
返回值 以上文中的回调地址为百度为例,授权完成后会跳转至https://www.baidu.com/?code=83953d36e2ae7c8903c6b589c8998670&state=xxxxx,携带参数code和state。

实际操作:

WEB网页登录授权界面(GET请求) 

统一身份管理平台IAM单点登录流程及第三方接口设计方案

登录成功跳转界面,携带参数code和state

统一身份管理平台IAM单点登录流程及第三方接口设计方案

#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
参数说明
参数名 说明 描述
client_id 应用标识 客户端应用注册ID
client_secret 密钥 客户端应用注册密钥
code 授权码 用户授权后获得的授权码code
grant_type 认证方式 请求类型,默认authorization_code

处理逻辑 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
参数说明
参数名 说明 描述
access_token token授权码
client_id 应用标识 客户端应用注册ID

处理逻辑 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票据及销毁应用本地会话的功能。 

流程图如下:

统一身份管理平台IAM单点登录流程及第三方接口设计方案

网页接口说明: 

请求类型 GET/WEB网页访问
请求示例 https://iam.xxxxx.com:8080/idp/profile/OAUTH2/Redirect/GLO?redirctToUrl=https://www.baidu.com&redirectToLogin=true&entityId=xxxxx
参数说明
参数名 说明 描述
redirctToUrl 回跳url 第三方(应用)的登录地址
redirectToLogin true 是否直接跳转至应用redirctToUrl,true为跳转至redirctToUrl,false会停留在IAM注销页面
entityId 应用ID 与client_id一致

处理逻辑 1、判断参数;
2、根据以上判断、验证及认证结果返回JSON数据。
返回值 以上文中的回调地址为百度为例,注销后会跳转至https://www.baidu.com,如果跳转为false,则会停留到IAM注销页面https://iam.xxxxx.com:8080/idp/http/logout.do

上一篇:kops在AWS EC2上自建K8S集群


下一篇:HZERO微服务平台08: 角色合并功能梳理