Keycloak从22升级到25后,React Native获取用户信息失败求助
Keycloak 22→25升级后React Native无法获取用户信息(401 Invalid Token)
升级Keycloak从22到25版本后,React Native应用调用用户信息接口时返回401 Unauthorized,Keycloak日志提示invalid_token,原因是Failed to read access token from JWT。已尝试以下方案但无效:
- 将Realm Frontend地址设为
http://localhost:8080/realms/myrealm - 为默认客户端范围添加
openidscope - 修改React Native应用中的Keycloak地址为
http://localhost:8080/realms/myrealm
前端调用代码
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(); }
排查与解决步骤
- 检查Token签名算法兼容性
Keycloak 24+版本默认将OIDC客户端的访问令牌签名算法从HS256改为RS256,对称密钥客户端易受影响:
- 登录Keycloak控制台,进入目标客户端→
Settings→Access Token Signature Algorithm,确认算法类型:- 临时兼容:将算法改回
HS256(不推荐长期使用) - 标准方案:在React Native端配置使用Keycloak Realm的公钥验证RS256签名
- 临时兼容:将算法改回
- 验证Token的Issuer一致性
确保前端获取的Token中iss字段与Keycloak Realm的Issuer完全匹配(包括协议、域名、端口、末尾斜杠):
- 解码前端的
access_token或id_token查看iss值 - 对比Keycloak Realm的OpenID配置(访问
http://localhost:8080/realms/myrealm/.well-known/openid-configuration查看issuer字段) - 不一致则调整React Native端的Discovery地址或Keycloak Realm的Frontend URL
- 检查客户端权限与Scope配置
- 确认客户端
Access Type设置为public(React Native应用常用类型) - 进入客户端→
Client Scopes,确保openid、profile等必要Scope已添加到Default Client Scopes中
- 清理旧Token缓存
升级后旧Token可能不符合新版本验证规则:
- 清除React Native应用中存储的旧Token(如AsyncStorage中的相关条目)
- 重新登录获取新Token后重试用户信息接口
- 检查Keycloak Realm的Token配置
- 进入Realm设置→
Tokens,确认Access Token Lifespan未过短,Token Signature Required处于开启状态 - 查看Realm→
Keys,确认签名用的密钥对未过期且状态有效
内容的提问来源于stack exchange,提问作者amelongo
相关产品推荐
相关产品推荐

