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$
;
我想念什么?
尝试添加 ::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;