使用Clojure发送x-www-form-urlencoded类型POST请求遇403错误求助
排查与解决方法
1. 开启重定向跟随(对应curl的--location参数)
curl的--location会自动处理3xx重定向,但httpkit默认不开启该功能,这可能是导致403的核心原因。修改代码添加:follow-redirects true选项,同时移除手动设置的Content-Type header——httpkit使用:form-params时会自动生成标准的application/x-www-form-urlencoded; charset=utf-8头,手动设置可能引发编码匹配问题:
(http/post auth-url {:form-params {:grant_type "client_credentials" :client_id client-id :client_secret client-secret :audience audience} :follow-redirects true})
2. 核对client_secret的完整值
原curl命令中client_secret的值以减号开头(-<client-secret>),确认你的Clojure变量client-secret是否完整包含这个前缀符号,参数值缺失符号是这类授权失败的常见原因。
3. 对比请求内容差异
通过打印请求详情,对比curl和httpkit发送的请求是否一致:
- 给httpkit添加
:debug true选项输出请求细节:
(http/post auth-url {:form-params {:grant_type "client_credentials" :client_id client-id :client_secret client-secret :audience audience} :follow-redirects true :debug true})
- 给curl添加
-v参数输出请求细节:
curl -v --location '<auth-url>' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'client_id=<client-ID>' \ --data-urlencode 'client_secret=-<client-secret>' \ --data-urlencode 'audience=<audience>'
重点对比:
- 请求头的
Content-Type是否一致 - 请求体的参数编码、顺序是否完全匹配
4. 放弃手动拼接查询参数的方式
OAuth2 Client Credentials流程要求参数放在POST请求的Body中,而非URL查询参数里。你之前尝试将参数拼到URL的方式不符合规范,服务器大概率会拒绝此类请求,应坚持使用:form-params传递参数。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

