Google Cloud Endpoints:Bearer认证头无法访问API,Query参数可行
我之前调试Endpoints认证时也踩过类似的坑,结合你的情况(query参数正常但Bearer头失效),给你整理几个核心排查点:
检查请求头名称是否正确
你提到用的是Authentication:Bearer,但官方要求的是Authorization:Bearer!这是最容易犯的拼写错误,很多人会把两个词搞混,确认一下你的请求头是不是写错了名称——把Authentication改成Authorization再试一次,大概率能解决问题。确认Bearer令牌的格式规范
令牌和Bearer之间必须有一个空格,也就是格式必须是:Authorization: Bearer <你的令牌内容>如果写成
Authorization:Bearer<令牌>(没有空格),Endpoints会识别为无效的认证头。检查OpenAPI配置中的认证规则
确认你的Endpoints配置文件(OpenAPI/ gRPC配置)里,是否正确启用了Bearer认证:- 对于OpenAPI,要确保
securitySchemes里定义了Bearer类型的认证,并且在security部分引用了该规则; - 如果是gRPC,要检查API配置里的认证策略是否正确关联了对应的OAuth2 issuer。
- 对于OpenAPI,要确保
排查中间件/代理对请求头的干扰
如果你的请求经过了网关、代理或者自定义中间件,有些服务会默认过滤或修改Authorization头(比如出于安全策略),导致Endpoints无法接收到正确的头信息。可以直接绕过代理,用curl直接调用Endpoints测试,看看是否正常。查看Cloud Logging的详细错误日志
去Cloud Logging里筛选Endpoints的请求日志,找到认证失败的请求条目,里面会有具体的错误原因(比如invalid_token、missing_authorization_header等),根据错误信息针对性修复。验证令牌的受众(Audience)和权限范围(Scope)
虽然query参数能正常访问,但还是要确认令牌的aud字段是否匹配你的Endpoints服务名称,以及令牌是否包含了API要求的权限范围。可以用gcloud auth print-identity-token生成令牌后,用JWT解析工具查看字段是否正确。
内容的提问来源于stack exchange,提问作者Mr. Blockchain

