You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure传统HTTP Web应用SSO认证后无法获取AccessToken问题排查

Keycloak认证后请求中无:oauth2/access-tokens键的排查与解决

问题描述

我正在用Clojure构建一个简单的请求响应式传统HTTP Web应用,以测试与Keycloak身份服务器的集成。使用ring-oauth2库并遵循文档配置后,启动应用访问http://localhost:3300/login完成Keycloak认证流程,重定向到首页后,请求中不存在:oauth2/access-tokens键。

应用初始化代码如下:

(defn app-routes []
  (ring/router
   [["/"
     {:get {:handler (fn [request]
                       (response-handler request views/home-page))}}]]))

(defn wrap-site-defaults [handler]
  (ring.middleware.session/wrap-defaults handler (-> ring.middleware.defaults/site-defaults (assoc-in [:session :cookie-attrs :same-site] :lax))))

(defn wrap-oauth2-config [handler]
  (wrap-oauth2
   handler
   {:keycloak
    {:client-id "my-app"
     :client-secret "***********"
     :authorize-uri "http://localhost:8080/realms/my-realm/protocol/openid-connect/auth"
     :access-token-uri "http://localhost:8080/realms/my-realm/protocol/openid-connect/token"
     :redirect-uri "http://localhost:3300/oauth2/callback"
     :scopes ["openid" "profile" "email"]
     :launch-uri "/login"
     :landing-uri "/"}}))

(defn -main []
  (let [handler (-> (ring/ring-handler (app-routes))
                    (wrap-oauth2-config) 
                    (wrap-site-defaults)
                    (ring.middleware.params/wrap-params))]
    (run-jetty handler {:port 3300 :join? false})
    (println "Server started on port 3300")))

排查与解决步骤

1. 修正中间件顺序(核心问题)

ring-oauth2中间件依赖session存储认证后的token,因此必须在session中间件之后加载,同时参数解析中间件需要优先处理请求参数。调整后的-main代码如下:

(defn -main []
  (let [handler (-> (ring/ring-handler (app-routes))
                    (ring.middleware.params/wrap-params)
                    (wrap-site-defaults)
                    (wrap-oauth2-config))]
    (run-jetty handler {:port 3300 :join? false})
    (println "Server started on port 3300")))

顺序逻辑:

  • 先通过wrap-params解析请求参数(oauth2回调需读取code等参数)
  • 再加载wrap-site-defaults初始化session环境
  • 最后加载wrap-oauth2-config,此时中间件可正常使用session存储token

2. 确认回调路由未被拦截

/oauth2/callback是ring-oauth2默认回调端点,需确保自定义路由未覆盖该路径。当前app-routes仅配置了"/",不会产生冲突,后续添加路由时需避免占用该路径。

3. 验证session配置有效性

检查wrap-site-defaults中的session配置:

  • site-defaults默认已包含session支持,内存session在开发环境可正常使用
  • 可在首页handler中打印(:session request),确认session是否存在且包含oauth2相关数据,排查session是否正常工作

4. 核对Keycloak客户端配置

  • 确认Keycloak客户端的Valid Redirect URIs已添加http://localhost:3300/oauth2/callback
  • 检查客户端是否启用了Authorization Code Flow(ring-oauth2默认使用该流程)
  • 确认client-secret与Keycloak中配置完全一致

内容的提问来源于stack exchange,提问作者Johan Pino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:51:02