GeneXus下使用指定公钥验证JWT Bearer Token的实现方案问询
Genexus JWT校验功能实现方案
需求说明:根据环境提供的公钥验证请求头中携带的"Bearer Token",同时校验用户可用的scope权限。
实现步骤
- 核心说明:
DoVerify方法的公钥通过第四个参数&JWTOptions的属性传入,不需要额外修改参数位置
步骤1:提前获取JWKS公钥
你需要先从指定的JWKS地址拉取公钥集合,解析JWT头部的kid字段匹配到对应公钥,转换为PEM格式的公钥字符串存储。建议对公钥做定时缓存,不要每次接口请求都重复拉取公钥。
步骤2:修正校验代码
&token = &HttpRequest.GetHeader('Authorization') if not &token.IsEmpty() &token = &token.Replace("Bearer ", "") // 配置JWTOptions传入公钥 &JWTOptions.SigningKey = &你获取到的PEM格式公钥变量 // 可按需开启内置校验:过期时间、签发人校验等 &JWTOptions.ValidateExpiration = True &JWTOptions.ValidateIssuer = True &result = &JWTCreator.DoVerify(&token, JWTAlgorithm.RS256, &privateClaims, &JWTOptions) if &result // Scope权限校验逻辑 &userScopes = &privateClaims.Get("scope") // 假设接口需要的权限为"api:read",可根据实际需求调整校验规则 if &userScopes.Contains("api:read") &mensagem = 'token is valid' else &codigo = 403 &mensagem = "Insufficient permissions" endif else &mensagem = "token is NOT valid" If &JWTCreator.HasError() &codigo = &JWTCreator.GetErrorCode().ToNumeric() &mensagem = &JWTCreator.GetErrorDescription() EndIf endif else &codigo = 401 &mensagem = "Token not found!" endif
注意事项
- 如果公钥解析失败,可检查是否正确去掉了JWKS返回的公钥头尾、换行符是否符合PEM格式要求
- Scope字段如果是空格分隔的字符串,可先按空格拆分再做权限匹配
- 生产环境建议将JWKS地址、允许的签发人、需要校验的Scope配置为环境变量,不要硬编码在代码里
内容的提问来源于stack exchange,提问作者Anderson Porcari
相关产品推荐
相关产品推荐

