通过OIDC获取用户信息
OIDC(OpenID Connect)是建立在OAuth 2.0基础上的一个认证协议,本文为您介绍应用如何使用OIDC获取阿里云登录用户的信息。
前提条件
获取用户登录信息前,您需要创建应用,设置应用名称、OAuth范围和回调地址等关键信息,并为应用生成应用密钥。具体操作,请参见创建应用、添加应用范围和创建应用密钥。
基本概念
概念 | 说明 |
身份令牌 | OIDC可以给应用下发代表登录用户的身份令牌。身份令牌用于获取姓名、登录名等用户信息,不能用于访问阿里云服务。 |
OIDC Discovery Endpoint | OIDC协议包含了不同的Endpoint用于不同的目的,Discovery Endpoint中包含OIDC协议所需要的所有配置信息,方便开发者使用。 说明 Discovery Endpoint是通过JSON文档来提供一系列键值,其中包含主要的提供者信息,例如:协议支持的响应类型、令牌颁发者的取值、身份令牌签名公钥的地址和签名算法等。 阿里云作为OIDC服务提供者,提供了一个Discovery Endpoint: Discovery Endpoint包含的内容示例如下: {
'code_challenge_methods_supported': [
'plain',
'S256'
],
'subject_types_supported': [
'public'
],
'response_types_supported': [
'code'
],
'issuer': 'https://oauth.aliyun.com',
'jwks_uri': 'https://oauth.aliyun.com/v1/keys',
'revocation_endpoint': 'https://oauth.aliyun.com/v1/revoke',
'token_endpoint': 'https://oauth.aliyun.com/v1/token',
'id_token_signing_alg_values_supported': [
'RS256'
],
'scopes_supported': [
'openid',
'aliuid',
'profile'
],
'authorization_endpoint': 'https://signin.aliyun.com/oauth2/v1/auth'} |
基本流程

- 用户通过浏览器登录应用。
- 应用重定向到阿里云OIDC服务并将URL返回给浏览器。
- 用户通过浏览器登录阿里云OIDC服务并申请授权码。
- 阿里云OIDC服务重定向到应用并返回授权码给浏览器。
- 浏览器通过应用使用授权码向阿里云OIDC服务申请身份令牌。
- 阿里云OIDC服务向应用返回身份令牌和访问令牌,应用通过身份令牌或访问令牌便可以获取用户信息。
示例一:应用获取OAuth服务身份令牌的签名公钥
请求示例如下:
private List getSignPublicKey() { HttpResponse response = HttpClientUtils.doGet('https://oauth.aliyun.com/v1/keys'); List rsaKeyList = new ArrayList(); if (response.getCode() == 200 && response.isSuccess()) { String keys = JSON.parseObject(response.getData()).getString('keys'); try { JSONArray publicKeyList = JSON.parseArray(keys); for (Object object : publicKeyList) { RSAKey rsaKey = RSAKey.parse(JSONObject.toJSONString(object));
rsaKeyList.add(rsaKey);
} return rsaKeyList;
} catch (Exception e) { LOG.info(e.getMessage());
}
} LOG.info('GetSignPublicKey failed:{}', response.getData()); throw new AuthenticationException(response.getData());
}示例二:验证身份令牌的JWT签名
阿里云颁发的身份令牌是带有签名的JWT(JSON Web Token),签名算法为JWS标准RS256。当应用请求获取用户信息时,需要应用对身份令牌进行验证,包含以下几个方面:
- 签名验证:请务必通过示例一获取OAuth服务公布的签名公钥,验证身份令牌的真实性和完整性。
OAuth服务的公钥会定期轮转,获取公钥请注意以下两点:
请求示例如下: - 有效期验证:检查令牌颁发时间和令牌过期时间的有效性。
- 检查令牌接收者:防止颁发给其他应用的身份令牌被传递给本应用。
示例三:解析身份令牌获取用户信息
- 返回参数
- 返回示例
示例四:通过访问令牌和UserInfo接口获取用户信息
除了直接获取身份令牌,您也可以在获取访问令牌后通过调用UserInfo接口获取用户信息,该接口必须使用访问令牌才能访问,返回信息不编码。
OIDC场景下,即只有openid、aliuid和profile这几个范围的时候,也会返回访问令牌,此时的访问令牌只能用于调用UserInfo接口。
UserInfo接口请求地址:https://oauth.aliyun.com/v1/userinfo。
请求示例如下:
GET v1/userinfo HTTP/1.1Host: oauth.aliyun.comAuthorization: Bearer SlAV32hkKG
返回参数如下表所示:
参数名称 | 描述 | 需要的OAuth范围 |
sub | 唯一代表登录用户的字符串,但并不包含阿里云UID、用户名等信息。 | openid |
type | 登录用户类型。 | profile |
name | 登录用户的显示名称。 说明 RAM用户和RAM角色请求时才会返回该参数。 | profile |
upn | RAM用户的登录名称。 说明 RAM用户请求时才会返回该参数。 | profile |
login_name | 阿里云账号(主账号)的登录名称。 说明 阿里云账号(主账号)请求时才会返回该参数。 | profile |
aid | 登录用户所属的阿里云账号(主账号)ID。 | aliuid |
uid | 登录用户的ID。 | aliuid |
Body返回示例如下:
- 阿里云账号请求时的Body返回示例
- RAM用户请求时的Body返回示例
- RAM角色请求时的Body返回示例

