使用Okta JWT验证器实现AWS API网关自定义授权的解码问题
解决Okta JWT Verifier Golang的Token头部解码错误问题
结合你的代码和错误日志,核心问题出在Token的传递格式上,我整理了几个优先级最高的解决方案:
1. 移除Bearer Token的前缀(最可能的根因)
你的授权器代码直接把event.AuthorizationToken传给了VerifyAccessToken,但这个值是完整的Bearer <token>字符串,而Okta的JWT验证器需要的是纯Token部分(去掉Bearer 前缀)。
如果把带前缀的字符串传给验证器,它会尝试把Bearer 当成JWT头部的一部分解析,自然会触发"不是Base64编码字符串"的错误。
修改你的授权器代码:
package main import ( "context" "errors" "fmt" "myapi/utils" "strings" // 引入strings包处理前缀 "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func Handler(ctx context.Context, event events.APIGatewayCustomAuthorizerRequest) (events.APIGatewayCustomAuthorizerResponse, error) { bearerToken := event.AuthorizationToken // 移除Bearer前缀,注意空格不能省略 token := strings.TrimPrefix(bearerToken, "Bearer ") // 如果没有找到前缀,直接判定Token格式无效 if token == bearerToken { fmt.Println("Invalid token format: missing Bearer prefix") return events.APIGatewayCustomAuthorizerResponse{}, errors.New("Unauthorized") } fmt.Println("Token:" + token) _, err := utils.VerifyAccessToken(token) if err != nil { fmt.Println("Verification error:" + err.Error()) return events.APIGatewayCustomAuthorizerResponse{}, errors.New("Unauthorized") } return utils.GeneratePolicy("user", "Allow", event.MethodArn), nil } func main() { lambda.Start(Handler) }
2. 升级Okta JWT Verifier版本
旧版本的okta-jwt-verifier-golang可能存在Base64URL解码的兼容性问题(JWT使用的是URL安全的Base64编码,和标准Base64有细微差异)。建议升级到最新版本:
go get github.com/okta/okta-jwt-verifier-golang@latest
3. 验证Token传输完整性
虽然你提到在jwt.io能正常解码,但建议在CloudWatch日志中打印移除前缀后的纯Token,对比客户端拿到的Token是否完全一致,排查是否在传输过程中被截断或篡改。
关于跨域问题的补充
你提到的跨域错误大概率是授权失败返回401导致的——AWS API Gateway在自定义授权器返回错误时,默认可能不会携带CORS响应头。等你解决Token解码问题后,如果跨域依然存在,可以检查:
- 确保API Gateway的CORS配置包含
Access-Control-Allow-Origin、Access-Control-Allow-Headers(尤其是Authorization)等必要头 - 确认Lambda授权器的错误响应不会覆盖网关的CORS配置
内容的提问来源于stack exchange,提问作者a11hard
相关产品推荐
相关产品推荐

