如何使用 pgjwt 执行接收令牌的函数

问题描述 投票:0回答:1

iam 尝试设置一个函数来通过 jwt 获取令牌。它在 Postgres 15 中,我想要一个以角色名和秘密作为输入的函数。 但我收到错误。如果我将其硬编码到函数中,它就可以工作。

这就是我所做的:

CREATE EXTENSION pgjwt;
    CREATE OR REPLACE FUNCTION api.sign_jwt(role_name text, secret_key text)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
    payload jsonb;
    token text;
    exp_time timestamp with time zone;
BEGIN
    
    exp_time = NOW() + interval '5 minutes';
    
    
    payload = jsonb_build_object('role', role_name, 'exp', EXTRACT(EPOCH FROM exp_time));

    
    token = sign(payload::text, secret_key);

    RETURN token;

END;
$function$
;
SELECT api.sign_jwt('meisneRolle', 'dawdawdwadw@%*dwadwadwwa');

错误:

SQL-Fehler [42883]: ERROR: function sign(text, text) does not exist
  Hinweis: No function matches the given name and argument types. You might need to add explicit type casts.
  Wobei: PL/pgSQL function api.sign_jwt(text,text) line 14 at assignment

Fehlerposition:

这正在工作:

select api.sign('{"role": "meisneRolle"}', 'dawdawdwadw@%*dwadwadwwa');

将其硬编码到函数中也可以工作:

CREATE OR REPLACE FUNCTION api.sign_jwt(role_name text, secret_key text)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
    payload jsonb;
    token text;
    exp_time timestamp with time zone;
BEGIN
    
    exp_time = NOW() + interval '5 minutes';
    
    
    payload = jsonb_build_object('role', role_name, 'exp', EXTRACT(EPOCH FROM exp_time));

    
    --token = sign(payload::text, secret_key);
   token= sign('{"role": "meisneRolle"}', 'dawdawdwadw@%*dwadwadwwa');

    RETURN token;

END;
$function$
;

我想念什么?

postgresql jwt token
1个回答
0
投票

尝试添加 ::json 来投射有效负载,如下所示:

该函数接收有效负载作为 pay 参数。

CREATE OR REPLACE FUNCTION api.generate_token(pay TEXT) RETURNS TEXT AS $$
DECLARE
    jwt TEXT;
BEGIN
    jwt := extensions.sign(
        payload := pay::json,
        secret := 'secret'::TEXT,
        algorithm := 'HS256'::TEXT
    );

    RETURN jwt;
END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.