有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

创建应用并授权访问

创建应用

1. 登录 数字身份管控平台(员工版)控制台,在左侧导航栏,单击应用管理
2. 在应用管理页面,单击新建应用,选择应用协议模板JWT,单击下一步
3. 在编辑应用信息页面,登记接入应用的相关信息,如下图所示:
redirect_uri:为应用系统的重定向地址,用于接收数字身份管控平台(员工版)以重定向的方式返回的 token。
target_link_uri:为应用系统单点登录成功后需要重定向的地址,一般用于跳转到二级菜单等。
SSO Binding:单点登录请求方式,默认为重定向 REDIRECT。
id_token 有效期:id_token 的有效期,单位为:秒。



授权访问

具体操作请参见 授权管理

开发对接步骤

步骤1:获取 JWT token

应用系统发起请求数字身份管控平台(员工版),数字身份管控平台(员工版)校验用户身份生成后生成 JWT token,通过重定向的方式将 token 返回应用系统。 请求方式:GET 请求 Url:
https://<auth.domain>/auth/sso/ssoLogin?service=<service>
请求地址也可参考应用管理页面 > 选定指定应用 > 单击应用配置 >对应的“应用登录地址”。
请求参数说明:
参数
参数位置
类型
是否必选
描述
示例值
service
Query
String
应用 ID,应用系统的唯一标志
ajgetgndtbaskbampvclw
重定向回应用系统 Url:
http(s)://<redirect_uri>?id_token=<token>
返回参数说明:
参数
参数位置
类型
是否必选
描述
示例值
id_token
Query
String
JWT token,有效时间与创建应用是设置的 id_token 有效期一致
-
返回的JWT token中,包含如下属性值:
claim 属性名
说明
sub
数字身份管控平台(员工版)中的用户名。
subjectId
数字身份管控平台(员工版)中的用户 ID。
secondaryAccount
用户对应的应用账号,多个应用账号以竖线分隔。

步骤2:验证 JWT 并获取 token 中的账号相关信息

应用系统侧,使用 jose4j api 对 token 进行验证,验证成功后获取 token 中的账号相关信息。 应用系统 pom.xml 引入 maven 依赖:
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.2</version>
</dependency>
验证 token,并从 token 中获取各声明字段的信息,参考代码:
/**
* 验证 JWT
*
* @param keyId 密钥 ID
* @param jwtTicket JWT 票据
* @param publicKeyStr 公钥
*/
public JwtClaims validateToken(String keyId, String jwtTicket, String publicKeyStr) throws Exception {
JsonWebSignature jws = new JsonWebSignature();
jws.setCompactSerialization(jwtTicket);
jws.setKey(JsonWebKey.Factory.newJwk(publicKeyStr).getKey());

boolean verifySignature = jws.verifySignature();
if (!verifySignature) {
logger.error("Invalid signature! jwtTicket:{} keyId: {} ", jwtTicket, keyId);
throw new Exception("Invalid signature!");
}

String payload = jws.getPayload();
JwtClaims claims = JwtClaims.parse(payload);
NumericDate expirationTime = claims.getExpirationTime();
if (expirationTime == null) {
logger.error("Invalid signature! jwtTicket:{} keyId: {} ", jwtTicket, keyId);
throw new Exception("Invalid signature!");
}
if (!expirationTime.isAfter(NumericDate.now())) {
logger.error("Jwt ticket expired! jwtTicket:{} keyId: {} ", jwtTicket, keyId);
throw new Exception("Jwt ticket expired!");
}

String loginSubject = claims.getSubject();
System.out.println("login subject is " + loginSubject);
return claims;
}
上述参考代码中:
jwtTicket:为步骤1获取的 JWT token.
keyId:可参考应用管理页面 > 选定指定应用 > 单击应用配置 > 对应的 JWT KeyID。
publicKeyStr:可参考应用管理页面 > 选定指定应用 > 单击应用配置 >对应的 JWT PublicKey。