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
相关产品推荐
相关产品推荐

