Actualizar access_token a través de refresh_token en Keycloak

3 minutos de lectura

Avatar de usuario de RaiBnod
RaiBnod

Necesito hacer que el usuario mantenga el inicio de sesión en el sistema si el usuario access_token caduque y el usuario quiera mantener el inicio de sesión. ¿Cómo puedo obtener una nueva actualización? access_token con el uso de refresh_token en Capa de llaves?

estoy usando vertx-autorización para la implementación de autenticación con Capa de llaves en vert.x. ¿Es posible actualizar access_token con vertx-autorización o Capa de llaves¿La propia API REST? ¿O cuál será otra implementación de esto?

Avatar de usuario de Yogendra Mishra
Yogendra Mishra

keycloak tiene API REST para crear un access_token usando refresh_token. Es un POST endpoint with application/x-www-form-urlencoded

Así es como se ve:

Method: POST
URL: https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token
Body type: x-www-form-urlencoded
Form fields:    
client_id : <my-client-name>
grant_type : refresh_token
refresh_token: <my-refresh-token>

Esto le dará un nuevo token de acceso usando el token de actualización.

NOTA: si su token de actualización ha caducado, arrojará una excepción 400 en la que puede hacer que el usuario inicie sesión nuevamente.

Echa un vistazo a una muestra en Postman, puedes desarrollar una API correspondiente usando esto.

Muestra en cartero

  • Intenté esto con 2.5.4 y aún requiere el secreto del cliente para esta solicitud. Sin embargo, ahora tiene sentido por qué se requerirá el secreto del cliente si se proporciona el token de actualización.

    – rrocky

    13 de diciembre de 2018 a las 6:42

  • El secreto del cliente solo es necesario si se trata de un confidencial cliente. Público los clientes no requieren el secreto del cliente.

    – rrocky

    13 de diciembre de 2018 a las 8:45

  • ¿Alguien puede explicar por qué se requiere el secreto del cliente al actualizar un token para un cliente confidencial?

    – Kimble

    21 de diciembre de 2018 a las 8:42

  • @all, ¿por qué el token de actualización tiene formato jwt? sin estado pero Google y auth0 usan estado.

    – Panup Pong

    12 sep 2019 a las 10:51

  • @kimble cliente confidencial en Keycloak está destinado a aplicaciones de servidor, donde almacenar un secreto de cliente es seguro. Echa un vistazo a los documentos (aquí)[keycloak.org/docs/6.0/server_admin/#oidc-clients]

    – negro

    20 de agosto de 2020 a las 20:09

@maslick es correcto, también debe proporcionar el secreto del cliente, no es necesario un encabezado de autorización en este caso:

http://localhost:8080/auth/realms/{realm}/protocol/openid-connect/token

ingrese la descripción de la imagen aquí

En caso de token de actualización caducado, devuelve:

ingrese la descripción de la imagen aquí

Si no agrega el secreto, obtiene 401 no autorizado aunque el token de actualización sea correcto

ingrese la descripción de la imagen aquí

  • Acabo de probarlo, solo necesita el secreto del cliente si el cliente que emitió el token es confidencial

    – Mateo

    19 de agosto de 2021 a las 0:35

Probé con 4.8.2.Final, da lo siguiente unauthorized_client incluso con token de acceso previo como ‘Bearer’. Entonces probé con Basic YXBwLXByb3h5OnNlY3JldA== en el encabezado de autorización. Luego funcionó, pero aún no estoy seguro de estar haciendo lo correcto.

  • Para los encabezados de autorización, todo se reduce a lo que el servidor busca en el valor del encabezado. Si esto funciona, probablemente no estés equivocado.

    – charliebeckcon

    28 de enero de 2019 a las 5:45

  • Probablemente esté utilizando un cliente confidencial, por lo que debe incluir client_secret en la solicitud

    – maslick

    8 de febrero de 2019 a las 15:12


  • ¿Por qué alguien querría usar un token de actualización si tengo que pasar client_secret para un cliente confidencial? En mi opinión, Keycloak debería devolver access_token simplemente pasando client_id y refresh_token ya que actúa como un secreto.

    – ganesan arunachalam

    20 mayo 2020 a las 13:30

Ampliando la respuesta de Yogendra Mishra. Tenga en cuenta que
client_id y client_secret también se puede enviar en el encabezado de Autorización.

Authorization: Basic ${Base64(<client_id>:<client_secret>)}

Esto funciona tanto para la llamada de token inicial (sin token de actualización) como para la llamada de token de actualización a /openid-connect/token punto final

Autorización básica1

no es necesario enviar el ID de cliente y el secreto en el cuerpo después de configurar los encabezados de autenticación

Referencia:
https://developer.okta.com/docs/reference/api/oidc/#client-secret

¿Ha sido útil esta solución?