aports/community/lua-resty-openidc/add-support-form-post-response.patch
Francesco Colista 3d62f97d66 community/lua-resty-openidc: added support for OAuth 2.0 Form Post Response Mode
Added patch (already merged in  master):
3aac462f82

Since their release cycle appears to be slow, this patch is added until
next version of package is released.

Fixes #13530
2022-02-18 14:09:56 +00:00

187 lines
6.5 KiB
Diff

From 789cf8ac48086b95c8522cb7b34bf63252341968 Mon Sep 17 00:00:00 2001
From: Hans Zandbelt <hans.zandbelt@zmartzone.eu>
Date: Wed, 13 Dec 2017 14:41:03 +0100
Subject: [PATCH 1/4] support for response_mode form_post
Signed-off-by: Hans Zandbelt <hans.zandbelt@zmartzone.eu>
whitespace
---
lib/resty/openidc.lua | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/lib/resty/openidc.lua b/lib/resty/openidc.lua
index 753ab22..415ad29 100644
--- a/lib/resty/openidc.lua
+++ b/lib/resty/openidc.lua
@@ -354,6 +354,10 @@ local function openidc_authorize(opts, session, target_url, prompt)
params.code_challenge = openidc_s256(code_verifier)
end
+ if opts.response_mode then
+ params.response_mode = opts.response_mode
+ end
+
-- merge any provided extra parameters
if opts.authorization_params then
for k, v in pairs(opts.authorization_params) do params[k] = v end
@@ -1076,8 +1080,14 @@ end
-- handle a "code" authorization response from the OP
local function openidc_authorization_response(opts, session)
- local args = ngx.req.get_uri_args()
- local err, log_err, client_err
+ local args, err, log_err, client_err
+
+ if opts.response_mode and opts.response_mode == "form_post" then
+ ngx.req.read_body()
+ args = ngx.req.get_post_args()
+ else
+ args = ngx.req.get_uri_args()
+ end
if not args.code or not args.state then
err = "unhandled request to the redirect_uri: " .. ngx.var.request_uri
From 493eefcbe963cecd2c3b0c3f243016eac0aa0e10 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig <stefan.bodewig@innoq.com>
Date: Wed, 3 Jan 2018 13:55:37 +0100
Subject: [PATCH 2/4] spec for form_post support
---
tests/spec/form_post_spec.lua | 94 +++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
create mode 100644 tests/spec/form_post_spec.lua
diff --git a/tests/spec/form_post_spec.lua b/tests/spec/form_post_spec.lua
new file mode 100644
index 0000000..a539c4d
--- /dev/null
+++ b/tests/spec/form_post_spec.lua
@@ -0,0 +1,94 @@
+local http = require("socket.http")
+local test_support = require("test_support")
+local ltn12 = require("ltn12")
+require 'busted.runner'()
+
+describe("when response_mode is form_post", function()
+ test_support.start_server({oidc_opts = {response_mode = "form_post"}})
+ teardown(test_support.stop_server)
+ local _, status, headers = http.request({
+ url = "http://127.0.0.1/default/t",
+ redirect = false
+ })
+ it("then it is included", function()
+ assert.truthy(string.match(headers["location"], ".*response_mode=form_post.*"))
+ end)
+end)
+
+local function do_post(cookie_header, body)
+ local x, y, z = http.request({
+ method = "POST",
+ url = "http://localhost/default/redirect_uri",
+ headers = {
+ ["Content-Type"] = "application/x-www-form-urlencoded",
+ ["Content-Length"] = string.len(body),
+ cookie = cookie_header,
+ },
+ source = ltn12.source.string(body),
+ redirect = false
+ })
+ return x, y, z
+end
+
+describe("when a form_post is received", function()
+ test_support.start_server({oidc_opts = {response_mode = "form_post"}})
+ teardown(test_support.stop_server)
+ local _, _, headers = http.request({
+ url = "http://localhost/default/t",
+ redirect = false
+ })
+ local state = test_support.grab(headers, 'state')
+ test_support.register_nonce(headers)
+ local cookie_header = test_support.extract_cookies(headers)
+ describe("without an active user session", function()
+ local _, redirStatus = http.request({
+ method = 'POST',
+ url = "http://localhost/default/redirect_uri",
+ headers = {
+ ["Content-Type"] = "application/x-www-form-urlencoded",
+ },
+ source = ltn12.source.string("code=foo&state=" .. state)
+ })
+ it("should be rejected", function()
+ assert.are.equals(401, redirStatus)
+ end)
+ it("will log an error message", function()
+ assert.error_log_contains("but there's no session state found")
+ end)
+ end)
+ describe("with bad state", function()
+ local _, redirStatus = do_post(cookie_header, "code=foo&state=X" .. state)
+ it("should be rejected", function()
+ assert.are.equals(401, redirStatus)
+ end)
+ it("will log an error message", function()
+ assert.error_log_contains("does not match state restored from session")
+ end)
+ end)
+ describe("without state", function()
+ local _, redirStatus = do_post(cookie_header, "code=foo")
+ it("should be rejected", function()
+ assert.are.equals(401, redirStatus)
+ end)
+ it("will log an error message", function()
+ assert.error_log_contains("unhandled request to the redirect_uri")
+ end)
+ end)
+ describe("without code", function()
+ local _, redirStatus = do_post(cookie_header, "state=" .. state)
+ it("should be rejected", function()
+ assert.are.equals(401, redirStatus)
+ end)
+ it("will log an error message", function()
+ assert.error_log_contains("unhandled request to the redirect_uri")
+ end)
+ end)
+ describe("with all things set", function()
+ local _, redirStatus, h = do_post(cookie_header, "code=foo&state=" .. state)
+ it("redirects to the original URI", function()
+ assert.are.equals(302, redirStatus)
+ assert.are.equals("/default/t", h.location)
+ end)
+ end)
+end)
+
From 3ba8fe14db0356426a043d37c3ba929f6f4c1995 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig <stefan.bodewig@innoq.com>
Date: Wed, 3 Jan 2018 14:05:01 +0100
Subject: [PATCH 3/4] make sure request is rejected for the correct reason
---
tests/spec/form_post_spec.lua | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/spec/form_post_spec.lua b/tests/spec/form_post_spec.lua
index a539c4d..d9989b0 100644
--- a/tests/spec/form_post_spec.lua
+++ b/tests/spec/form_post_spec.lua
@@ -41,13 +41,15 @@ describe("when a form_post is received", function()
test_support.register_nonce(headers)
local cookie_header = test_support.extract_cookies(headers)
describe("without an active user session", function()
+ local body = "code=foo&state=" .. state
local _, redirStatus = http.request({
method = 'POST',
url = "http://localhost/default/redirect_uri",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
+ ["Content-Length"] = string.len(body),
},
- source = ltn12.source.string("code=foo&state=" .. state)
+ source = ltn12.source.string(body)
})
it("should be rejected", function()
assert.are.equals(401, redirStatus)