Quais são os pontos de extremidade OAuth2 / OpenID Connect da Keycloak?


103

Estamos tentando avaliar o Keycloak como uma solução SSO, e parece bom em muitos aspectos, mas a documentação carece dolorosamente do básico.

Para uma determinada instalação do Keycloak http://localhost:8080/para o reino test, o que são o Terminal de autorização OAuth2 , o Terminal de Token OAuth2 e o Terminal de UserInfo do OpenID Connect ?

Não estamos interessados ​​em usar a própria biblioteca cliente do Keycloak, queremos usar bibliotecas cliente OAuth2 / OpenID Connect padrão, pois os aplicativos cliente que usam o servidor keycloak serão escritos em uma ampla variedade de linguagens (PHP, Ruby, Node, Java, C # , Angular). Portanto, os exemplos que usam o cliente Keycloak não são úteis para nós.


1
O que você acabou usando em vez disso?
— Ced

1
Finalmente, conseguimos convencer lá em cima de que o OAuth não tem nada a ver com login e segurança como uma tecnologia a ser usada no próprio aplicativo, e é relevante apenas para integração com terceiros. Era difícil explicar o fato de que o Google e FB usá-lo em todos os lugares não tem relevância para nós.
— Amir Abiri

6
@AmirAbiri não diria que é usado apenas para integração de terceiros. Esse é o seu principal uso hoje em dia, mas, sendo um protocolo que mais e mais empresas de internet suportam, também pode fazer sentido se você estiver lidando com vários aplicativos (ou microsserviços) em seu próprio ambiente corporativo e quiser uma solução SSO. Na verdade, no meu caso, tendo usado keycloak por mais de 10 meses, acho que também pode merecer para aplicações simples, pois cuida de todo o gerenciamento de usuários.
— Xtreme Biker

Respostas:


138

Para Keycloak 1.2, as informações acima podem ser recuperadas através do url

http: // keycloakhost: keycloakport / auth / realms / {realm} /. well-known / openid-configuration

Por exemplo, se o nome do realm for demo :

http: // keycloakhost: keycloakport / auth / realms / demo / .well-known / openid-configuration

Um exemplo de saída do url acima:

{
    "issuer": "http://localhost:8080/auth/realms/demo",
    "authorization_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth",
    "token_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/token",
    "userinfo_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo",
    "end_session_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/logout",
    "jwks_uri": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs",
    "grant_types_supported": [
        "authorization_code",
        "refresh_token",
        "password"
    ],
    "response_types_supported": [
        "code"
    ],
    "subject_types_supported": [
        "public"
    ],
    "id_token_signing_alg_values_supported": [
        "RS256"
    ],
    "response_modes_supported": [
        "query"
    ]
}

Informações encontradas em https://issues.jboss.org/browse/KEYCLOAK-571

Observação: pode ser necessário adicionar seu cliente à lista de URIs de redirecionamento válidos


1
Desde então, descartamos o uso do Keycloak, então não posso verificar.
— Amir Abiri

Qual URL seria usado para ter um link de login em um aplicativo da web? Você tentou todos eles, mas eles não fazem isso
— Ced

2
@AmirAbiri qual é a sua alternativa ao KeyCloak? Atualmente estou avaliando isso. Ele gosta da interface do usuário e gostaria que todos os meus usuários fossem gerenciados por ela, mas tenho dificuldade em conectar meu aplicativo GoLang a ela.
— Tarion 01 de

@Tarion Existe um servidor de identidade WSO2, para começar.
— Não posso dizer

20

Com a versão 1.9.3.Final, o Keycloak possui vários endpoints OpenID disponíveis. Eles podem ser encontrados em /auth/realms/{realm}/.well-known/openid-configuration. Supondo que seu domínio seja nomeado demo, esse endpoint produzirá uma resposta JSON semelhante a esta.

{
  "issuer": "http://localhost:8080/auth/realms/demo",
  "authorization_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth",
  "token_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/token",
  "token_introspection_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/token/introspect",
  "userinfo_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo",
  "end_session_endpoint": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/logout",
  "jwks_uri": "http://localhost:8080/auth/realms/demo/protocol/openid-connect/certs",
  "grant_types_supported": [
    "authorization_code",
    "implicit",
    "refresh_token",
    "password",
    "client_credentials"
  ],
  "response_types_supported": [
    "code",
    "none",
    "id_token",
    "token",
    "id_token token",
    "code id_token",
    "code token",
    "code id_token token"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "response_modes_supported": [
    "query",
    "fragment",
    "form_post"
  ],
  "registration_endpoint": "http://localhost:8080/auth/realms/demo/clients-registrations/openid-connect"
}

Pelo que descobri, esses terminais implementam a especificação Oauth 2.0 .


Observe que o OpenID Connect é basicamente um conjunto de padrões, dos quais OAuth 2 é um (JWT é outro)
— Stijn de Witt

2
Este comentário é um tanto enganoso. OAuth2 é um padrão para implementar um protocolo de autorização. OIDC é um padrão que funciona em cima do OAuth2 para identificação.
— Thomas Lann


15

Depois de muito cavar, conseguimos extrair mais ou menos as informações (principalmente da biblioteca de cliente JS do próprio Keycloak):

  • Endpoint de autorização: /auth/realms/{realm}/tokens/login
  • Terminal de token: /auth/realms/{realm}/tokens/access/codes

Quanto ao OpenID Connect UserInfo , agora (1.1.0.Final) Keycloak não implementa este ponto de extremidade, portanto, não é totalmente compatível com OpenID Connect. No entanto, já existe um patch que acrescenta que, no momento desta escrita, deve ser incluído no 1.2.x.

Mas - Ironicamente, o Keycloak envia de volta um id_tokenin junto com o token de acesso. Tanto o id_tokenquanto o access_tokensão JWTs assinados , e as chaves do token são chaves do OpenID Connect, ou seja:

"iss":  "{realm}"
"sub":  "5bf30443-0cf7-4d31-b204-efd11a432659"
"name": "Amir Abiri"
"email: "..."

Portanto, embora o Keycloak 1.1.x não seja totalmente compatível com o OpenID Connect, ele "fala" na linguagem do OpenID Connect.


7

Na versão 1.9.0 json com todos os endpoints está em address / auth / realms / {realm}

  • Endpoint de autorização: / auth / realms / {realm} / account
  • Endpoint de token: / auth / realms / {realm} / protocol / openid-connect

7

Você também pode ver essas informações acessando Admin Console -> Configurações de território -> clicando no hiperlink no campo Endpoints.

insira a descrição da imagem aqui


1
Você sabe onde a documentação pode ser encontrada para esses terminais?
— raarts

você, eu sinto que a documentação poderia ter sido um pouco amigável
— Rohit Kumar

3

versão keycloak: 4.6.0

  • TokenUrl: [domínio] / auth / realms / {REALM_NAME} / protocol / openid-connect / token
  • AuthUrl: [domínio] / auth / realms / {REALM_NAME} / protocol / openid-connect / auth

sim, isso é válido para 5.0 também. Eles estão documentados aqui: keycloak.org/docs/5.0/server_admin/…
— JP Lew

2

FQDN / auth / realms / {realm_name} /. Well-known / openid-configuration

você verá tudo aqui, além disso, se o provedor de identidade também for Keycloak, então alimentar esta URL configurará tudo também verdadeiro com outros provedores de identidade se eles suportarem e já lidarem com isso


2

Link a seguir Fornece documento JSON que descreve metadados sobre o Keycloak

/auth/realms/{realm-name}/.well-known/openid-configuration

A seguir as informações relatadas com Keycloak 6.0.1 para o masterreino

{  
   "issuer":"http://localhost:8080/auth/realms/master",
   "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
   "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
   "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
   "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
   "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
   "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
   "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
   "grant_types_supported":[  
      "authorization_code",
      "implicit",
      "refresh_token",
      "password",
      "client_credentials"
   ],
   "response_types_supported":[  
      "code",
      "none",
      "id_token",
      "token",
      "id_token token",
      "code id_token",
      "code token",
      "code id_token token"
   ],
   "subject_types_supported":[  
      "public",
      "pairwise"
   ],
   "id_token_signing_alg_values_supported":[  
      "PS384",
      "ES384",
      "RS384",
      "HS256",
      "HS512",
      "ES256",
      "RS256",
      "HS384",
      "ES512",
      "PS256",
      "PS512",
      "RS512"
   ],
   "userinfo_signing_alg_values_supported":[  
      "PS384",
      "ES384",
      "RS384",
      "HS256",
      "HS512",
      "ES256",
      "RS256",
      "HS384",
      "ES512",
      "PS256",
      "PS512",
      "RS512",
      "none"
   ],
   "request_object_signing_alg_values_supported":[  
      "PS384",
      "ES384",
      "RS384",
      "ES256",
      "RS256",
      "ES512",
      "PS256",
      "PS512",
      "RS512",
      "none"
   ],
   "response_modes_supported":[  
      "query",
      "fragment",
      "form_post"
   ],
   "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
   "token_endpoint_auth_methods_supported":[  
      "private_key_jwt",
      "client_secret_basic",
      "client_secret_post",
      "client_secret_jwt"
   ],
   "token_endpoint_auth_signing_alg_values_supported":[  
      "RS256"
   ],
   "claims_supported":[  
      "aud",
      "sub",
      "iss",
      "auth_time",
      "name",
      "given_name",
      "family_name",
      "preferred_username",
      "email"
   ],
   "claim_types_supported":[  
      "normal"
   ],
   "claims_parameter_supported":false,
   "scopes_supported":[  
      "openid",
      "address",
      "email",
      "microprofile-jwt",
      "offline_access",
      "phone",
      "profile",
      "roles",
      "web-origins"
   ],
   "request_parameter_supported":true,
   "request_uri_parameter_supported":true,
   "code_challenge_methods_supported":[  
      "plain",
      "S256"
   ],
   "tls_client_certificate_bound_access_tokens":true,
   "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.