如何让前端应用认证访问GCP IAP保护的后端服务
场景1:跨项目IAP保护应用的访问
可以正常访问,但需要满足两个关键条件:
- 用户已通过前端example.com的IAP认证,持有有效的IAP ID token
- 后端api.example.com所在项目的IAP权限配置中,已将@example.com域的用户(或对应组)添加到允许访问的列表里
IAP的ID token基于用户身份生成,不受GCP项目边界限制,只要用户身份符合后端IAP的权限规则,携带token的跨项目请求就能通过验证。
场景2:公开前端访问IAP保护后端的跳转问题
默认IAP的302跳转逻辑会回到后端域名,但可以通过自定义前端认证流程实现跳回前端的需求。
默认流程中,直接请求受保护的后端会触发IAP跳转至Google认证页,认证完成后会回到后端地址,无法直接跳回前端。要改变这个行为,需要前端主动发起认证,而不是依赖IAP的自动跳转。
核心困惑:认证后跳回前端并发起授权请求的实现方案
直接通过前端主导的OAuth2认证流程就能解决,具体步骤如下:
配置OAuth2客户端
在GCP控制台创建Web类型的OAuth2客户端ID,将前端域名https://example.com添加到「已授权的JavaScript来源」,将前端回调地址(比如https://example.com/auth-callback)添加到「已授权的重定向URI」。前端发起认证请求
使用Google Identity Services SDK(或gapi库)在前端触发认证,指定scope为openid email profile,并设置redirect_uri为你的前端回调页面。用户完成Google账号认证后,会被重定向回前端的回调地址。处理认证回调并获取ID token
在前端回调页面,从URL参数中获取授权码,用它向Google的token端点交换ID token和刷新令牌。验证ID token的有效性:确保iss为https://accounts.google.com,aud匹配你的OAuth客户端ID,hd为example.com(限制域内用户)。携带token请求后端
前端后续向api.example.com发起请求时,在请求头中添加Authorization: Bearer <你的ID_TOKEN>。后端的IAP会自动验证这个token,验证通过则允许访问,不会触发302跳转。
额外注意事项
- 后端IAP的权限列表必须添加@example.com域的用户或组,确保身份验证通过后能获得访问权限
- ID token默认有效期为1小时,前端需要用刷新令牌定期获取新的ID token,避免请求失效
- 刷新令牌属于敏感信息,建议用HttpOnly、Secure属性的Cookie存储,不要存在前端本地存储中
内容的提问来源于stack exchange,提问作者piotrekkr

