This is an automated email from the ASF dual-hosted git repository.

monkeydluffy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 129844c67 fix(openid-connect): add redirect_after_logout_uri for ODIC 
that do not have an end_session_endpoint (#10653)
129844c67 is described below

commit 129844c67f7ab1fd857b57c08e5d14b4fdb5862b
Author: Zhenyu Luo <[email protected]>
AuthorDate: Mon Dec 25 09:12:59 2023 +0800

    fix(openid-connect): add redirect_after_logout_uri for ODIC that do not 
have an end_session_endpoint (#10653)
---
 apisix/plugins/openid-connect.lua        |  15 ++++
 docs/en/latest/plugins/openid-connect.md |   2 +-
 docs/zh/latest/plugins/openid-connect.md |   2 +-
 t/plugin/openid-connect.t                | 122 +++++++++++++++++++++++++++++++
 4 files changed, 139 insertions(+), 2 deletions(-)

diff --git a/apisix/plugins/openid-connect.lua 
b/apisix/plugins/openid-connect.lua
index 8ed6ab444..a64ba2fa9 100644
--- a/apisix/plugins/openid-connect.lua
+++ b/apisix/plugins/openid-connect.lua
@@ -440,6 +440,8 @@ function _M.rewrite(plugin_conf, ctx)
         conf.timeout = conf.timeout * 1000
     end
 
+    local path = ctx.var.request_uri
+
     if not conf.redirect_uri then
         -- NOTE: 'lua-resty-openidc' requires that 'redirect_uri' be
         --       different from 'uri'.  So default to append the
@@ -464,6 +466,19 @@ function _M.rewrite(plugin_conf, ctx)
         conf.ssl_verify = "no"
     end
 
+    if path == (conf.logout_path or "/logout") then
+        local discovery, discovery_err = openidc.get_discovery_doc(conf)
+        if discovery_err then
+            core.log.error("OIDC access discovery url failed : ", 
discovery_err)
+            return 503
+        end
+        if conf.post_logout_redirect_uri and not 
discovery.end_session_endpoint then
+            -- If the end_session_endpoint field does not exist in the OpenID 
Provider Discovery
+            -- Metadata, the redirect_after_logout_uri field is used for 
redirection.
+            conf.redirect_after_logout_uri = conf.post_logout_redirect_uri
+        end
+    end
+
     local response, err, session, _
 
     if conf.bearer_only or conf.introspection_endpoint or conf.public_key then
diff --git a/docs/en/latest/plugins/openid-connect.md 
b/docs/en/latest/plugins/openid-connect.md
index 23b50906c..99f4d9800 100644
--- a/docs/en/latest/plugins/openid-connect.md
+++ b/docs/en/latest/plugins/openid-connect.md
@@ -43,7 +43,7 @@ description: OpenID Connect allows the client to obtain user 
information from th
 | realm                                | string   | False    | "apisix"        
      |              | Realm used for authentication.                           
                                                                                
                                                                                
             |
 | bearer_only                          | boolean  | False    | false           
      |              | When set to `true`, APISIX will only check if the 
authorization header in the request matches a bearer token.                     
                                                                                
                    |
 | logout_path                          | string   | False    | "/logout"       
      |              | Path for logging out.                                    
                                                                                
                                                                                
             |
-| post_logout_redirect_uri             | string   | False    |                 
      |              | URL to redirect to after logging out.                    
                                                                                
                                                                                
             |
+| post_logout_redirect_uri             | string   | False    |                 
      |              | URL to redirect to after logging out. If the OIDC 
discovery endpoint does not provide an 
[`end_session_endpoint`](https://openid.net/specs/openid-connect-rpinitiated-1_0.html),
 the plugin internally redirects using the 
[`redirect_after_logout_uri`](https://github.com/zmartzone/lua-resty-openidc). 
Otherwise, it redirects using the 
[`post_logout_redirect_uri`](https://openid.net/specs/open [...]
 | redirect_uri                         | string  | False    |                  
     |              | URI to which the identity provider redirects back to. If 
not configured, APISIX will append the `.apisix/redirect` suffix to determine 
the default `redirect_uri`. Note that the provider should be properly 
configured to allow such `redirect_uri` values. |
 | timeout                              | integer  | False    | 3               
      | [1,...]      | Request timeout time in seconds.                         
                                                                                
                                                                                
             |
 | ssl_verify                           | boolean  | False    | false           
      |              | When set to true, verifies the identity provider's SSL 
certificates.                                                                   
                                                                                
               |
diff --git a/docs/zh/latest/plugins/openid-connect.md 
b/docs/zh/latest/plugins/openid-connect.md
index 3ae3fe356..9c5f18b43 100644
--- a/docs/zh/latest/plugins/openid-connect.md
+++ b/docs/zh/latest/plugins/openid-connect.md
@@ -42,7 +42,7 @@ description: OpenID Connect(OIDC)是基于 OAuth 2.0 的身份认证协议
 | realm                                | string  | 否     | "apisix"            
  |               | bearer token 无效时 [`WWW-Authenticate` 
响应头](https://www.rfc-editor.org/rfc/rfc6750#section-3)中会伴随着的 `realm` 讯息。        
                                                                        |
 | bearer_only                          | boolean | 否     | false               
  |               | 当设置为 `true` 时,将仅检查请求头中的令牌(Token)。                           
                    |
 | logout_path                          | string  | 否     | "/logout"           
  |               | 登出路径。                                                       
                                 |
-| post_logout_redirect_uri             | string  | 否     |                     
  |               | 调用登出接口后想要跳转的 URL。                                           
                          |
+| post_logout_redirect_uri             | string  | 否     |                     
  |               | 调用登出接口后想要跳转的 URL。如果 OIDC 的服务发现端点没有提供 
[`end_session_endpoint`](https://openid.net/specs/openid-connect-rpinitiated-1_0.html)
 ,插件内部会使用 
[`redirect_after_logout_uri`](https://github.com/zmartzone/lua-resty-openidc) 
进行重定向,否则使用 
[`post_logout_redirect_uri`](https://openid.net/specs/openid-connect-rpinitiated-1_0.html)
 进行重定向。 |
 | redirect_uri                         | string  | 否     |                     
  |               | 身份提供者重定向返回的 URI。如果缺失,则 APISIX 将在当前 URI 之后追加 
`.apisix/redirect` 作为默认的 `redirect_uri`。注意,OP 也需要适当配置以允许这种形式的 `redirect_uri`。 |
 | timeout                              | integer | 否     | 3                   
  | [1,...]       | 请求超时时间,单位为秒                                                 
                            |
 | ssl_verify                           | boolean | 否     | false               
  | [true, false] | 当设置为 `true` 时,验证身份提供者的 SSL 证书。                              
                       |
diff --git a/t/plugin/openid-connect.t b/t/plugin/openid-connect.t
index a62ef771b..f539a5fba 100644
--- a/t/plugin/openid-connect.t
+++ b/t/plugin/openid-connect.t
@@ -1303,3 +1303,125 @@ passed
     }
 --- response_body_like
 x-userinfo: ey.*
+
+
+
+=== TEST 34: Set up new route with plugin matching URI `/*`
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{ "plugins": {
+                            "openid-connect": {
+                                "client_id": 
"kbyuFDidLLm280LIwVFiazOqjO3ty8KH",
+                                "client_secret": 
"60Op4HFM0I8ajz0WdiStAbziZ-VFQttXuxixHHs2R7r7-CW8GR79l-mmLqMhc-Sa",
+                                "discovery": 
"https://samples.auth0.com/.well-known/openid-configuration";,
+                                "redirect_uri": "https://iresty.com";,
+                                "post_logout_redirect_uri": 
"https://iresty.com";,
+                                "scope": "openid profile"
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1980": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/*"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+--- response_body
+passed
+
+
+
+=== TEST 35: Check whether auth0 can redirect normally using 
post_logout_redirect_uri configuration
+--- config
+    location /t {
+        content_by_lua_block {
+            local http = require "resty.http"
+            local httpc = http.new()
+            local uri = "http://127.0.0.1:"; .. ngx.var.server_port .. "/logout"
+            local res, err = httpc:request_uri(uri, {method = "GET"})
+            ngx.status = res.status
+            local location = res.headers['Location']
+            if location and string.find(location, 'https://iresty.com') ~= -1 
and
+                string.find(location, 
'post_logout_redirect_uri=https://iresty.com') ~= -1 then
+                ngx.say(true)
+            end
+        }
+    }
+--- timeout: 10s
+--- response_body
+true
+--- error_code: 302
+
+
+
+=== TEST 36: Set up new route with plugin matching URI `/*`
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{ "plugins": {
+                            "openid-connect": {
+                                "client_id": 
"942299072001-vhduu1uljmdhhbbp7g22m3qsmo246a75.apps.googleusercontent.com",
+                                "client_secret": 
"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",
+                                "discovery": 
"https://accounts.google.com/.well-known/openid-configuration";,
+                                "redirect_uri": "https://iresty.com";,
+                                "post_logout_redirect_uri": 
"https://iresty.com";,
+                                "scope": "openid profile"
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1980": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/*"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+--- response_body
+passed
+
+
+
+=== TEST 37: Check whether google can redirect normally using 
post_logout_redirect_uri configuration
+--- config
+    location /t {
+        content_by_lua_block {
+            local http = require "resty.http"
+            local httpc = http.new()
+            local uri = "http://127.0.0.1:"; .. ngx.var.server_port .. "/logout"
+            local res, err = httpc:request_uri(uri, {method = "GET"})
+            ngx.status = res.status
+            local location = res.headers['Location']
+            if location and string.find(location, 'https://iresty.com') ~= -1 
and
+                string.find(location, 
'post_logout_redirect_uri=https://iresty.com') ~= -1 then
+                ngx.say(true)
+            end
+        }
+    }
+--- timeout: 10s
+--- response_body
+true
+--- error_code: 302

Reply via email to