O OpenID Connect (OIDC) é uma camada de identidade baseada no OAuth 2.0 que permite ao seu aplicativo obter informações sobre os usuários que fazem login no Alibaba Cloud.
Pré-requisitos
Você concluiu as seguintes tarefas: Crie um aplicativo, Gerencie escopos OAuth e Crie um segredo de cliente.
Conceitos principais
|
Conceito |
Descrição |
|
ID token |
O OIDC emite um ID token que representa o usuário conectado. O token contém informações do usuário, como nome e nome de login, mas não pode ser usado para acessar services do Alibaba Cloud. |
|
Endpoint de descoberta OIDC |
O endpoint de descoberta OIDC fornece toda a configuração do OIDC em um único local, simplificando a integração para desenvolvedores. Nota
O endpoint de descoberta retorna um documento json com metadados do provedor, incluindo tipos de resposta suportados, o valor do emissor, a url da chave pública para verificação de assinatura do ID token e algoritmos de assinatura suportados. Endpoint de descoberta OIDC do Alibaba Cloud: Exemplo de resposta do endpoint de descoberta:
|
Como funciona

Um usuário faz login no aplicativo por meio de um navegador.
-
Seu aplicativo redireciona o navegador do usuário para o service OIDC do Alibaba Cloud.
NotaSe o usuário não estiver conectado, a solicitação será redirecionada adicionalmente para o service de login do Alibaba Cloud.
O usuário faz login no Alibaba Cloud e autoriza seu aplicativo.
O service OIDC do Alibaba Cloud redireciona o navegador do usuário de volta ao seu aplicativo, fornecendo um código de autorização.
Seu aplicativo troca o código de autorização por um ID token no service OIDC do Alibaba Cloud.
-
O service OIDC do Alibaba Cloud retorna um ID token e um access token para o aplicativo. Em seguida, o aplicativo pode obter informações do usuário usando o ID token ou o access token.
Casos de uso comuns:
-
Analise diretamente o ID token para obter informações do usuário.
O aplicativo deve verificar a assinatura do ID token: obtenha as chaves públicas (Example 1: Obtain the signature public key), verifique a assinatura JWT (Example 2: Verify the JWT signature) e analise as informações do usuário (Example 3: Parse an ID token).
-
Utilize o ID token para comunicação entre diferentes módulos.
O aplicativo deve verificar a assinatura do ID token: obtenha as chaves públicas (Example 1: Obtain the signature public key) e verifique a assinatura JWT (Example 2: Verify the JWT signature).
-
Use o access token para consultar informações do usuário várias vezes.
Após obter o access token, o aplicativo chama o endpoint UserInfo para recuperar informações do usuário (Example 4: Use the UserInfo endpoint).
-
Exemplo 1: Obter a chave pública de assinatura
Exemplo de solicitação:
private List getSignPublicKey() {
HttpResponse response = HttpClientUtils.doGet("https://oauth.alibabacloud.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());
}
Exemplo 2: Verificar a assinatura JWT
Os ID tokens do Alibaba Cloud são JSON Web Tokens (JWTs) assinados. O algoritmo de assinatura é RS256, conforme definido pelo padrão JWS. Valide cada ID token verificando:
-
Validação de assinatura: Use as chaves públicas do service OAuth (Example 1) para verificar a autenticidade e integridade do ID token.
O service OAuth rotaciona suas chaves públicas regularmente. Ao obter chaves públicas:
Busque as chaves públicas por solicitação. Não as armazene em cache por longo prazo.
Durante a rotação de chaves, o service pode retornar múltiplas chaves válidas. Tente cada chave até que uma verifique a assinatura. Não presuma uma quantidade fixa de chaves.
Exemplo de solicitação:
public boolean verifySign(SignedJWT signedJWT) { List publicKeyList = getSignPublicKey(); RSAKey rsaKey = null; for (RSAKey key : publicKeyList) { if (signedJWT.getHeader().getKeyID().equals(key.getKeyID())) { rsaKey = key; } } if (rsaKey != null) { try { RSASSAVerifier verifier = new RSASSAVerifier(rsaKey.toRSAPublicKey()); if (signedJWT.verify(verifier)) { return true; } } catch (Exception e) { LOG.info("Verify exception:{}", e.getMessage()); } } throw new AuthenticationException("Can't verify signature for id token"); } Validação de tempo de vida: Verifique se o horário de emissão e o horário de expiração do token são válidos.
Validação de audiência: Confirme se a claim
audcorresponde ao ID de cliente do seu aplicativo.
Exemplo 3: Analisar um ID token
-
Parâmetros de resposta
-
Claims do cabeçalho
Parâmetro
Descrição
Escopo OAuth
alg
O algoritmo de assinatura.
openid
kid
O ID da chave pública usada para assinar o token. Use esta chave para verificar a assinatura e evitar adulterações.
openid
-
Claims do corpo
Parâmetro
Descrição
Escopo OAuth
exp
O timestamp que indica o horário de expiração do token.
openid
sub
Um identificador único e estável para o usuário conectado. Não inclui informações como o UID do Alibaba Cloud ou nome de usuário.
NotaSe o usuário conectado for uma função ram, a claim sub é gerada a partir de
<RoleId:RoleSessionName>. Cada sessão de função tem seu próprio valor sub.openid
aud
A audiência do token, que corresponde ao ID de cliente do seu aplicativo.
openid
iss
O emissor do token. O valor é https://oauth.alibabacloud.com.
openid
iat
O timestamp que indica quando o token foi emitido.
openid
type
O tipo do usuário conectado. Valores válidos:
-
account: Uma conta Alibaba Cloud (conta principal).
-
user: Um usuário ram.
-
role: Uma função ram.
profile
name
O nome de exibição do usuário conectado. Valores válidos:
-
Para um usuário ram: o nome de exibição do usuário ram.
-
Para uma função ram:
<RoleName:RoleSessionName>.
NotaEsta claim é retornada apenas para um usuário ram ou uma função ram.
profile
upn
O nome de login do usuário ram.
NotaEste parâmetro é retornado apenas para um usuário ram.
profile
login_name
O nome de login da conta Alibaba Cloud (conta principal).
NotaEste parâmetro é retornado apenas para uma conta Alibaba Cloud (conta principal).
profile
aid
O ID da conta Alibaba Cloud à qual o usuário pertence.
aliuid
uid
O ID do usuário conectado. Valores válidos:
-
Para uma conta Alibaba Cloud (conta principal): o ID da conta Alibaba Cloud, que é igual ao valor de aid.
-
Para um usuário ram: o ID do usuário ram.
-
Para uma função ram: o ID da função ram.
aliuid
-
-
-
Exemplos de resposta
-
Exemplo de cabeçalho
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" } -
Exemplos de corpo
Estes exemplos mostram payloads de ID token decodificados. O token real é uma única string JWT codificada que deve ser verificada (Example 2: Verify the JWT signature).
-
Exemplo de payload para uma conta Alibaba Cloud
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", // The login name of the Alibaba Cloud account "aid": "123456789012****", // The ID of the Alibaba Cloud account "uid": "123456789012****" // The ID of the Alibaba Cloud account } -
Exemplo de payload para um usuário ram
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "user", "name": "alice", // The display name of the RAM user "upn": "alice@example.onaliyun.com", // The login name of the RAM user "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM user belongs "uid": "234567890123****" // The ID of the RAM user } -
Exemplo de payload para uma função ram
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", // The display name of the RAM role "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM role belongs "uid": "300800165472****" // The ID of the RAM role }
-
-
Exemplo 4: Usar o endpoint UserInfo
Chame o endpoint UserInfo com um access token para recuperar informações do usuário. A resposta é retornada como json simples, não como um token codificado.
Mesmo que você solicite apenas os escopos openid, aliuid e profile, um access token será retornado. Este token tem escopo restrito apenas ao endpoint UserInfo.
A url do endpoint UserInfo é https://oauth.alibabacloud.com/v1/userinfo.
Exemplo de solicitação:
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKG
Parâmetros de resposta:
|
Parâmetro |
Descrição |
Escopo OAuth |
|
sub |
Um identificador único e estável para o usuário conectado. Não inclui informações como o UID do Alibaba Cloud ou nome de usuário. |
openid |
|
type |
O tipo do usuário conectado. |
profile |
|
name |
O nome de exibição do usuário conectado. Nota
Este parâmetro é retornado apenas para um usuário ram ou uma função ram. |
profile |
|
upn |
O nome de login do usuário ram. Nota
Este parâmetro é retornado apenas para um usuário ram. |
profile |
|
login_name |
O nome de login da conta Alibaba Cloud (conta principal). Nota
Este parâmetro é retornado apenas para uma conta Alibaba Cloud (conta principal). |
profile |
|
aid |
O ID da conta Alibaba Cloud à qual o usuário pertence. |
aliuid |
|
uid |
O ID do usuário conectado. |
aliuid |
Exemplos de resposta:
-
Exemplo de resposta para uma conta Alibaba Cloud
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", // The login name of the Alibaba Cloud account "aid": "123456789012****", // The ID of the Alibaba Cloud account "uid": "123456789012****" // The ID of the Alibaba Cloud account } -
Exemplo de resposta para um usuário ram
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "user", "name": "alice", // The display name of the RAM user "upn": "alice@example.onaliyun.com", // The login name of the RAM user "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM user belongs "uid": "234567890123****" // The ID of the RAM user } -
Exemplo de resposta para uma função ram
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "role", "name": "NetworkAdministrator:alice", // The display name of the RAM role "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM role belongs "uid": "300800165472****" // The ID of the RAM role }