一、缘由
近期试用阿里云API网关作为中转,开始时安全认证方式选择无认证。好快就能接通。
二、升级安全方式
再将安全认证方式调整为OpenID Connect,模式选择业务API。要求配置一个Token对应的参数名称,初时以为是token名,就随便起了个mytoken。
配置好之后,用postman请求,报错。
Status :400 Bad Request
X-Ca-Error-Code :I400JR
X-Ca-Error-Message : JWT required header:X-Token missing
提示比较明显,header缺少X-Token
这个X-Token又从哪里可以生成呢?文档里面有提到
https://help.aliyun.com/document_detail/177489.html?spm=a2c4g.11186623.6.592.12016a3aK0jUvR
关键内容:
用户可以在这个站点https://mkjwk.org 生成用于token生成与验证的私钥与公钥, 私钥用于授权服务签发JWT,公钥配置到JWT插件中用于API网关对请求验签,目前API网关支持的秘钥对的加密算法为RSA SHA256,秘钥对的加密的位数为2048。
创建JWT插件并绑定到API上面,但是问题来了,这个私钥(左1)直接填到程序中,jsonwebtoken无法使用json来做密钥,用JSON.stringify转换了一下,可以生成加密串,填到X-Token,报错。
Status :403 Forbidden
X-Ca-Error-Code :A403JK
X-Ca-Error-Message : No matching JWK, `<EMPTY>` not found
报错码相同,但是内容有些不同,感觉有个kid不知道要填在什么地方。研究了一段时间,终于发现是要填在jsonwebtoken,使用sign签名时的header配置里面。用postman请求,以为解决了,又有新的报错。
Status :403 Forbidden
X-Ca-Error-Code :A403JT
X-Ca-Error-Message : Invalid JWT: JWT processing failed. Additional details: [[17] Unable to process JOSE object (cause: org.jose4j.lang.InvalidKeyException: class sun.security.rsa.RSAPublicKeyImpl cannot be used for HMAC verification.): JsonWebSignature{"alg":"HS256","typ":"JWT","kid":"BRFpdhrViq2zaaaBEWZITz"}->eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik84ZnBkaHJWaXEyemFhYUJFV1pJVHoifQ.eyJ1c2VyIjoibGN3YWkiLCJwYXNzd29yZCI6Im1za3dpaXdxIzg5anVkamQiLCJpYXQiOjE2MTkzMzI5MDcsImV4cCI6MTYxOTQxOTMwN30.9NBLDCnxqkOBK0ZNrsPKROTnrU9v_QRtVwGWYhZjieQ]
弄了两天都解决不了,试了许多方法,都想放弃了。
最后发现在指明algorithm的类型和private_key.pem来加密。
令人向往的200码终于出现