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.

Amir Abiri
fonte
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

Não posso dizer
fonte
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 .

lanceball
fonte
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
16

Na verdade, o link para .well-knowestá na primeira guia de suas configurações de reino - mas o link não se parece com um link, mas como o valor da caixa de texto ... design de interface do usuário ruim. Captura de tela da guia geral do Realm

Vitaliy Markitanov
fonte
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.

Amir Abiri
fonte
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
Krzysztof Pobozan
fonte
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

Anwar Husain
fonte
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
user1653042
fonte
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

Haseb Ansari
fonte
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"
}
Ravthiru
fonte