Я не знал, как декодировать результат из ключа keycloak publi c и сертификатов. Какой из них я должен использовать для декодирования? У меня есть только access_token
. И были попытки с сертификатом и public_key
Результат от: https://keycloak.some.domain/auth/realms/name-realm/
{
"realm": "name-realm",
"public_key": "some-secert-stringMIIBIsome-secert-stringknhFmdCmX9lu1EJNEsome-secert-string",
"token-service": "https://keycloak.some.domain/auth/realms/name-realm/protocol/openid-connect",
"account-service": "https://keycloak.some.domain/auth/realms/name-realm/account",
"tokens-not-before": 0
}
Результат от: https://keycloak.some.domain/auth/realms/epf-uat/protocol/openid-connect/certs
{
"keys": [
{
"kid": "WtJZKhwIsome-secert-stringA",
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"n": "xtG3QzVml8lxYQz1FaesgZ2-TPR2h_NqGHwRsome-secert-stringH2Bd5Dncsome-secert-stringEHVBAd75gzIPh_wTsome-secert-stringiAw",
"e": "AQAB",
"x5c": [
"some-secert-string"
],
"x5t": "y-Ksome-secert-stringMViQ",
"x5t#S256": "vvsome-secert-stringbosome-secert-stringtE8QW2vnmw60NJfaDJlVE"
}
]
}
Я пробовал использовать его https://github.com/mpdavis/python-jose для декодирования JWT. вот пример:
Настройка:
keycloak_algorithm = ["RS256"]
keycloak_domain = "https://keycloak.some.domain/auth/realms/some-realm/"
keycloak_audience = "https://login.some-domain.com"
Auth.py
token = CLEANED_BEARER_TOKEN_FROM_CLIENT
jsonurl = urlopen(setting.keycloak_domain)
algorithms = setting.keycloak_algorithm
audience = setting.keycloak_audience
issuer = setting.keycloak_domain
jwks = json.loads(jsonurl.read())
try:
payload = jwt.decode(token, jwks["public_key"], algorithms=algorithms, audience=audience, issuer=issuer)
except jwt.ExpiredSignatureError:
raise AuthError("Token is expired. Please update your token.", 401)
except jwt.JWTClaimsError as e:
raise AuthError("Invalid claims. " + str(e), 401)
except jwt.JWTError as e:
raise AuthError("JWT Error." + str(e), 401)
except Exception as e:
raise AuthError("Unable to parse authentication token. " + str(e), 401)
Вот результат, если я использую домен ( без protocol/openid-connect/certs
конечных точек в):
AuthError: ('Unable to parse authentication token. Could not deserialize key data.', 401)
А вот если я использую конечные точки protocol/openid-connect/certs
:
AuthError: ('JWT Error.Signature verification failed.', 401)
У меня нет Идея, почему эти 2 вещи (public_key
и сертификаты) не могут быть расшифрованы.
Другие примечания:
Я использую FastApi (https://fastapi.tiangolo.com/)
Есть рабочая часть с express js. Поэтому я использую только аутентификацию из express js с приложением python. (express js достигнет конечной точки, предоставив access_code
)