es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Token OIDC de Keycloak

Tengo un usuario con todos los permisos. Solicito un token (sin autenticación del navegador, mediante grant_type=password) y obtengo un token de acceso, que se puede usar para ver eventos. Inicio sesión exitosamente a través de OIDC y obtengo un token de acceso, pero no puedo usar este token para ver eventos (401 no autorizado).
Aquí está el código para obtener el token sin inicio de sesión en el navegador:

import requests

payload = {
        "client_id": "lox",
        "client_secret": "394bcd36-b576-42e2-80ae-d349eef941b9",
        "grant_type": "password",
        "username": "a",
        "password": "a",
        "Content-Type": "application/x-www-form-urlencoded",
    }
http = "http://127.0.0.1:8080/auth/realms/demo/protocol/openid-connect/token"
a = requests.post(http, data=payload)
a = a.json()
print(a['access_token'])

Prueba access_token

http2 = 'http://127.0.0.1:8080/auth/admin/realms/demo/events'
header = {
    'Authorization': "Bearer " + a['access_token']
}
b = requests.request("GET", http2, headers=header)
b = b.json()

Con este access_token puedo ver/gestionar usuarios/eventos.
Este es el código de inicio de sesión de OIDC:

client_id = 'lox'
client_secret = '394bcd36-b576-42e2-80ae-d349eef941b9'
redirect_uri = 'http://127.0.0.1:8000/'
scope = 'openid email profile'

oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)

authorization_url, state = oauth.authorization_url(
    'http://localhost:8080/auth/realms/demo/protocol/openid-connect/auth')

print(authorization_url)
authorization_response = input()
token = oauth.fetch_token(
    'http://localhost:8080/auth/realms/demo/protocol/openid-connect/token',
    authorization_response=authorization_response,
    client_secret=client_secret)
r = oauth.get('http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo')
r = oauth.get('http://127.0.0.1:8080/auth/admin/realms/demo/events')

Obtengo exitosamente la información del usuario (eso significa que el token es válido), pero cuando intento ver eventos obtengo un error 401.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí podría estar relacionado con el alcance del token de acceso obtenido a través de grant_type=password versus el token de acceso obtenido a través de OIDC. Es posible que el token de acceso obtenido a través de grant_type=password tenga permisos adicionales que permitan acceder a ver eventos, mientras que el token de acceso obtenido a través de OIDC no tenga esos permisos.

    Otra posibilidad es que el token de acceso obtenido a través de OIDC haya caducado o haya sido revocado, por lo que no es válido al intentar acceder al punto final de eventos.

    Para solucionar el problema, podrías intentar obtener un nuevo token de acceso a través de grant_type=password y usarlo para acceder al punto final de eventos para confirmar que aún está funcionando correctamente. También podrías revisar los registros del servidor Keycloak para ver si hay algún mensaje de error relacionado con el error 401 no autorizado, lo que podría dar más información sobre la causa raíz del problema.

Comments are closed.