Identity Server 4与Angular 5集成报错:unauthorized_client Invalid redirect_uri
这个问题本质上就是客户端发送的redirect_uri和Identity Server允许的列表不匹配,而且Identity Server的匹配是严格到每一个字符的——哪怕多一个斜杠、协议不对、IP写错都会触发这个错误。我帮你梳理几个最可能的问题点:
1. 先检查Identity Server的客户端配置
你需要确保AllowedRedirectUris里配置的是Angular客户端的完整绝对URL,而不是示例里的localhost。比如用C#配置客户端时,应该写成这样:
new Client { ClientId = "你的Angular客户端ID", // 其他基础配置... AllowedRedirectUris = { "http://192.168.1.60:4200/callback" }, // 这里要和Angular里的redirectUri完全一致 // 其他权限/范围配置... }
注意:这里不能写localhost:4200/callback,必须替换成你实际部署的IP和端口,还要加上正确的回调路径(比如/callback或者/assets/signin-callback.html,取决于你用的Angular OAuth库)。
2. 核对Angular客户端的redirectUri配置
Angular这边的redirectUri必须和Identity Server里的AllowedRedirectUris完全一致,包括:
- 协议:如果是HTTP就都写http,HTTPS就都写https(两边要统一)
- IP和端口:必须是
192.168.1.60:4200,不能是localhost - 路径:比如用
angular-oauth2-oidc的话,默认回调路径是/callback,那就要写成http://192.168.1.60:4200/callback - 末尾斜杠:比如服务器里配置的是
/callback,客户端就不能写成/callback/,反之亦然,必须完全匹配
推荐你用动态生成的方式避免硬编码出错,比如:
export const authConfig: AuthConfig = { issuer: 'http://192.168.1.50:5000', redirectUri: window.location.origin + '/callback', // 自动获取当前客户端的IP和端口 clientId: '你的客户端ID', // 其他配置... };
3. 关于redirect_uri的误区纠正
你问redirect_uri是不是客户端应用内的路径?答案是不是,它必须是一个绝对URL。Identity Server需要知道把授权后的令牌回调到哪个具体的网络地址,所以必须是完整的「协议+IP/域名+端口+路径」组合。示例用localhost是因为本地开发时客户端跑在localhost,实际部署到局域网就必须替换成对应的IP。
4. 快速定位差异的技巧
打开Identity Server的调试日志(临时开启即可),里面会明确显示类似这样的信息:
The redirect URI 'xxx' is not allowed for client 'xxx'. Allowed redirect URIs are 'yyy'
对比日志里的xxx(客户端实际发送的)和yyy(服务器允许的),就能一眼看到哪里不匹配了。
内容的提问来源于stack exchange,提问作者Sushil

