kong/spec/03-plugins/19-hmac-auth/04-invalidations_spec.lua (225 lines of code) (raw):
local helpers = require "spec.helpers"
local cjson = require "cjson"
local openssl_hmac = require "resty.openssl.hmac"
for _, strategy in helpers.each_strategy() do
describe("Plugin: hmac-auth (invalidations) [#" .. strategy .. "]", function()
local proxy_client
local admin_client
local consumer
local credential
local db
lazy_setup(function()
local bp
bp, db = helpers.get_db_utils(strategy, {
"routes",
"services",
"plugins",
"consumers",
"hmacauth_credentials",
})
local route = bp.routes:insert {
hosts = { "hmacauth.com" },
}
bp.plugins:insert {
name = "hmac-auth",
route = { id = route.id },
config = {
clock_skew = 3000,
},
}
consumer = bp.consumers:insert {
username = "consumer1",
custom_id = "1234",
}
credential = bp.hmacauth_credentials:insert {
username = "bob",
secret = "secret",
consumer = { id = consumer.id },
}
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
}))
proxy_client = helpers.proxy_client()
admin_client = helpers.admin_client()
end)
lazy_teardown(function()
if proxy_client and admin_client then
proxy_client:close()
admin_client:close()
end
helpers.stop_kong(nil, true)
end)
local function hmac_sha1_binary(secret, data)
return openssl_hmac.new(secret, "sha1"):final(data)
end
local function get_authorization(username)
local date = os.date("!%a, %d %b %Y %H:%M:%S GMT")
local encodedSignature = ngx.encode_base64(hmac_sha1_binary("secret", "date: " .. date))
return [["hmac username="]] .. username
.. [[",algorithm="hmac-sha1",headers="date",signature="]]
.. encodedSignature .. [["]], date
end
describe("HMAC Auth Credentials entity invalidation", function()
it("should invalidate when Hmac Auth Credential entity is deleted", function()
-- It should work
local authorization, date = get_authorization("bob")
local res = assert(proxy_client:send {
method = "GET",
path = "/requests",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(200, res)
-- Check that cache is populated
local cache_key = db.hmacauth_credentials:cache_key("bob")
res = assert(admin_client:send {
method = "GET",
path = "/cache/" .. cache_key,
body = {},
})
assert.res_status(200, res)
-- Retrieve credential ID
res = assert(admin_client:send {
method = "GET",
path = "/consumers/consumer1/hmac-auth/",
body = {},
})
local body = assert.res_status(200, res)
local credential_id = cjson.decode(body).data[1].id
assert.equal(credential.id, credential_id)
-- Delete Hmac Auth credential (which triggers invalidation)
res = assert(admin_client:send {
method = "DELETE",
path = "/consumers/consumer1/hmac-auth/" .. credential_id,
body = {},
})
assert.res_status(204, res)
-- ensure cache is invalidated
helpers.wait_for_invalidation(cache_key)
-- It should not work
authorization, date = get_authorization("bob")
local res = assert(proxy_client:send {
method = "POST",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(401, res)
end)
it("should invalidate when Hmac Auth Credential entity is updated", function()
local res = assert(admin_client:send {
method = "POST",
path = "/consumers/consumer1/hmac-auth/",
body = {
username = "bob",
secret = "secret",
consumer = { id = consumer.id },
},
headers = {
["Content-Type"] = "application/json",
}
})
local body = assert.res_status(201, res)
credential = cjson.decode(body)
-- It should work
local authorization, date = get_authorization("bob")
local res = assert(proxy_client:send {
method = "GET",
path = "/requests",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(200, res)
-- It should not work
local authorization, date = get_authorization("hello123")
res = assert(proxy_client:send {
method = "GET",
path = "/requests",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(401, res)
-- Update Hmac Auth credential (which triggers invalidation)
res = assert(admin_client:send {
method = "PATCH",
path = "/consumers/consumer1/hmac-auth/" .. credential.id,
body = {
username = "hello123"
},
headers = {
["Content-Type"] = "application/json"
}
})
assert.res_status(200, res)
-- ensure cache is invalidated
local cache_key = db.hmacauth_credentials:cache_key("bob")
helpers.wait_for_invalidation(cache_key)
-- It should work
local authorization, date = get_authorization("hello123")
local res = assert(proxy_client:send {
method = "GET",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(200, res)
end)
end)
describe("Consumer entity invalidation", function()
it("should invalidate when Consumer entity is deleted", function()
-- It should work
local authorization, date = get_authorization("hello123")
local res = assert(proxy_client:send {
method = "GET",
path = "/requests",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(200, res)
-- Check that cache is populated
local cache_key = db.hmacauth_credentials:cache_key("hello123")
res = assert(admin_client:send {
method = "GET",
path = "/cache/" .. cache_key,
body = {},
})
assert.res_status(200, res)
-- Delete Consumer (which triggers invalidation)
res = assert(admin_client:send {
method = "DELETE",
path = "/consumers/consumer1",
body = {},
})
assert.res_status(204, res)
-- ensure cache is invalidated
helpers.wait_for_invalidation(cache_key)
-- It should not work
local authorization, date = get_authorization("bob")
local res = assert(proxy_client:send {
method = "GET",
body = {},
headers = {
["HOST"] = "hmacauth.com",
date = date,
authorization = authorization
}
})
assert.res_status(401, res)
end)
end)
end)
end