我刚刚从Keycloak 22升级到25;
尽管我尝试了所有建议,但我无法获取用户信息:
您可以帮忙吗:
我使用 React Native 作为前端应用程序。为了获取用户信息,我使用这个方法:
const getUserInfo = await fetchUserInfoAsync(tokenResult, discoveryResult!);
我从 keycloak 日志中得到的错误是:
2024-07-30 22:52:33 2024-07-31 05:52:33,095 WARN [org.keycloak.events] (executor-thread-4) type="USER_INFO_REQUEST_ERROR", realmId="a8f79f64-1833-4832-9b3a-079763cb6fc3", realmName="myrealm", clientId="null", userId="null", ipAddress="172.17.0.1", error="invalid_token", reason="Failed to read access token from JWT", auth_method="validate_access_token"
我从 React Native 应用程序收到的错误位于 Fetch.js 中的第 42 行:
// Fix a problem with React Native `URL` causing a trailing slash to be added.
const correctedUrl = url.toString().replace(/\/$/, '');
const response = await fetch(correctedUrl, request); ---> (error here: 401 Unauthorized)
const contentType = response.headers.get('content-type');
if (isJsonDataType || contentType?.includes('application/json')) {
return response.json();
}
您能帮忙吗?我花了两天时间试图解决这个问题。
谢谢
升级 Keycloak 后出现“无法从 JWT 读取访问令牌”错误以及 React Native 应用程序中的 401 未经授权错误表明传入的令牌可能无效,或者存在与升级后 Keycloak 如何处理令牌相关的配置问题。以下是排查和解决问题的分步指南:
检查令牌格式:验证传入的令牌是否是有效的 JWT(JSON Web 令牌)。您可以使用 jwt.io 等工具来解码 JWT 并检查其内容。
令牌过期:验证令牌是否未过期。 JWT 有一个 Exp 凭证,指示过期时间。
验证签名:确保token签名有效。无效签名可能会导致 Keycloak 拒绝令牌。
正确的客户端 ID:仔细检查您的 React Native 应用程序是否在 Keycloak 领域配置中使用正确的客户端 ID 和密钥(如果适用)。
范围和角色:验证 OpenID 范围是否正确应用于客户端以及用户是否已分配所需的角色。
领域配置:验证领域的令牌配置在升级过程中未更改。检查访问令牌生命周期和访问令牌签名算法。
密钥和证书:验证用于签署令牌的密钥仍然有效并且在升级过程中没有更改或损坏。您可以在 Keycloak 的领域设置 > 密钥下检查这一点。
OIDC 发现文档:验证您的发现文档(通常位于 http://localhost:8080/realms/myrealm/.well-known/openid-configuration)是否可访问并包含正确的令牌端点。
后端 URL:验证 React Native 应用程序中指向 Keycloak 的 URL 是否正确,并且包含正确的领域和协议设置。
获取token:重新检查您的应用获取和发送token的流程。确保您传递给 fetchUserInfoAsync 的令牌是正确的。
Keycloak 日志:将 Keycloak 日志级别提高到 DEBUG 以获取更多详细信息。这将帮助您确定令牌被拒绝的确切原因。
React Native 调试:在 React Native 应用程序的令牌生成和检索过程中添加日志记录,以确保发送和接收正确的令牌。
跨源问题 CORS 设置:如果您的 Keycloak 服务器与 React Native 应用程序不在同一域中,请确保您的 Keycloak 跨源资源共享 (CORS) 设置已正确配置为接受来自 React Native 应用程序的请求域允许应用程序。
使用 Postman 或 CURL 进行测试
手动测试:尝试使用 Postman 或 CURL 使用相同的令牌手动向 UserInfo 端点发出请求。这将帮助您确定问题是与令牌本身有关还是与 React Native 应用程序处理令牌的方式有关。
如果这些步骤无法解决您的问题,检查版本 22 和 25 之间引入的 Keycloak 特定更改或弃用可能会很有用,这些更改或弃用可能会影响令牌验证或用户信息的检索。