自定义访问令牌钩子
自定义由 Supabase Auth 颁发的访问令牌
自定义访问令牌钩子在令牌颁发前运行,允许您根据使用的身份验证方法添加额外的声明(claims)。
返回的声明必须符合我们的规范。Supabase Auth 会在钩子运行后检查这些声明,如果不存在则会返回错误。
以下是当前访问令牌中可用的字段:
必需声明:iss
, aud
, exp
, iat
, sub
, role
, aal
, session_id
可选声明:jti
, nbf
, app_metadata
, user_metadata
, amr
, email
, phone
输入参数
字段 | 类型 | 描述 |
---|---|---|
user_id | string | 尝试登录用户的唯一标识符 |
claims | object | 包含在访问令牌中的声明信息 |
authentication_method | string | 用于请求访问令牌的认证方法。可能的值包括:oauth , password , otp , totp , recovery , invite , sso/saml , magiclink , email/signup , email_change , token_refresh , anonymous |
12345678910111213141516171819{ "user_id": "8ccaa7af-909f-44e7-84cb-67cdccb56be6", "claims": { "aud": "authenticated", "exp": 1715690221, "iat": 1715686621, "sub": "8ccaa7af-909f-44e7-84cb-67cdccb56be6", "email": "", "phone": "", "app_metadata": {}, "user_metadata": {}, "role": "authenticated", "aal": "aal1", "amr": [ { "method": "anonymous", "timestamp": 1715686621 } ], "session_id": "4b938a09-5372-4177-a314-cfa292099ea2", "is_anonymous": true }, "authentication_method": "anonymous"}
输出
仅当您的钩子成功处理输入且没有错误时返回这些内容。
字段 | 类型 | 描述 |
---|---|---|
claims | object | 钩子运行后更新后的声明(claims)对象。 |
在某些情况下,JWT的大小可能会成为问题,特别是当您使用服务端渲染框架时。导致JWT过大的常见情况包括:
- 用户有特别长的姓名、电子邮件地址或电话号码
- 默认JWT包含来自OAuth提供商的过多声明
- 包含过大的头像URL
为了减小JWT的大小,您可以定义如下所示的Custom Access Token钩子,它将指示Auth服务器仅签发包含列出声明的JWT。请查阅上方文档了解哪些JWT声明必须存在且不能被移除。
参考Postgres JSON函数了解如何操作jsonb
对象。
1234567891011121314151617181920212223242526272829303132create or replace function public.custom_access_token_hook(event jsonb)returns jsonblanguage plpgsqlas $$ declare original_claims jsonb; new_claims jsonb; claim text; begin original_claims = event->'claims'; new_claims = '{}'::jsonb; foreach claim in array array[ -- 在此添加您想保留的声明 'iss', 'aud', 'exp', 'iat', 'sub', 'role', 'aal', 'session_id' ] loop if original_claims ? claim then -- 如果original_claims包含列出的声明之一,将其设置到new_claims中 new_claims = jsonb_set(new_claims, array[claim], original_claims->claim); end if; end loop; return jsonb_build_object('claims', new_claims); end$$;