Skip to content
Written with Claude
IMPORTANT

As you may notice, this page and pretty much the entire website were obviously created with the help of AI. I wonder how you could tell? Was it a big "Written With Claude" badge on every page? I moved it to the top now (with the help of AI of course) to make it even more obvious. There are a few blogposts that were written by me manually, the old-fashioned way, I hope there will be more in the future, and those have a similar "Human Written" badge. This project (not the website), on the other hand, is a very, very different story. It took me more than two years of painstaking and unpaid work in my own free time. A story that, hopefully, I will tell someday. But meanwhile, what would you like me to do? To create a complex documentation website with a bunch of highly technical articles with the help of AI and fake it, to give you an illusion that I also did that manually? Like the half of itnernet is doing at this point? How does that makes any sense? Is that even fair to you? Or maybe to create this website manually, the old-fashioned way, just for you? While working a paid job for a salary, most of you wouldn't even get up in the morning. Would you like me to sing you a song while we're at it? For your personal entertainment? Seriously, get a grip. Do you find this information less valuable because of the way this website was created? I give my best to fix it to keep the information as accurate as possible, and I think it is very accurate at this point. If you find some mistakes, inaccurancies or problems, there is a comment section at the bottom of every page, which I also made with the help of the AI. And I woould very much appreciate if you leave your feedback there. Look, I'm just a guy who likes SQL, that's all. If you don't approve of how this website was constructed and the use of AI tools, I suggest closing this page and never wever coming back. And good riddance. And I would ban your access if I could know how. Thank you for your attention to this matter.

LOGOUT

Also known as

signout (with or without @ prefix)

Mark endpoint as a sign-out endpoint.

Syntax

@logout

Logout Endpoint Behavior

When an endpoint is marked with logout, NpgsqlRest executes the sign-out operation after running the function.

Void Functions

If the function returns void, NpgsqlRest simply:

  1. Executes the function
  2. Calls sign-out on all authentication schemes
  3. Completes the response

Functions with Return Values

If the function returns values, all returned values are interpreted as authentication scheme names to sign out from. This allows selective logout from specific schemes.

  • Single values are added as scheme names
  • Arrays are expanded - each element becomes a scheme name
  • NULL values are ignored
  • If no schemes are returned (empty result), signs out from all schemes

This is useful when using multiple authentication schemes (e.g., Cookie and Bearer Token) and you want to sign out from only specific ones.

Examples

Basic Logout (Void)

sql
create function signout()
returns void
language sql
as $$
  -- Optionally perform cleanup
  delete from sessions where user_id = current_user_id()
$$;

comment on function signout() is
'HTTP POST
@logout
@authorize';

Signs out from all authentication schemes.

Logout from Specific Scheme

sql
create function logout_cookie()
returns text
language sql
as $$
  select 'Cookies'::text
$$;

comment on function logout_cookie() is
'HTTP POST /auth/logout/cookie
@logout
@authorize';

Signs out only from the "Cookies" authentication scheme.

Logout from Multiple Schemes

sql
create function logout_web()
returns text[]
language sql
as $$
  select array['Cookies', 'Bearer']::text[]
$$;

comment on function logout_web() is
'HTTP POST /auth/logout/web
@logout
@authorize';

Signs out from both "Cookies" and "Bearer" schemes.

Conditional Scheme Logout

sql
create function smart_logout(_scheme text default null)
returns text
language sql
as $$
  select _scheme  -- Returns NULL to logout from all, or specific scheme
$$;

comment on function smart_logout(text) is
'HTTP POST /auth/logout
@logout
@authorize';
  • POST /auth/logout → Signs out from all schemes
  • POST /auth/logout?_scheme=Cookies → Signs out only from Cookies

Logout with Cleanup

sql
create function full_logout()
returns void
language plpgsql
as $$
begin
  -- Revoke all refresh tokens for this user
  delete from refresh_tokens where user_id = current_user_id();

  -- Log the logout event
  insert into audit_log(user_id, action)
  values (current_user_id(), 'logout');
end;
$$;

comment on function full_logout() is
'HTTP POST
@logout
@authorize';

Comments

Released under the MIT License.