认证

PKCE流程

关于使用PKCE流程进行身份验证


代码交换证明密钥(PKCE)流程是用户进行身份验证的两种方式之一,您的应用可通过此流程获取必要的访问令牌和刷新令牌。

虽然Supabase Auth已为您处理了该流程的实现细节,但理解PKCE与隐式流程之间的区别,对于理解纯客户端与服务端身份验证的差异至关重要。

工作原理

验证成功后,用户会被重定向回您的应用,URL格式如下:

1
https://yourapp.com/...?code=<...>

其中 code 参数通常称为授权码(Auth Code),可通过调用 exchangeCodeForSession(code) 方法兑换为访问令牌(access token)。

由于该流程在服务端运行,localStorage 可能不可用。您可以通过配置 storage 选项来使用自定义存储适配器,例如将数据存储在cookie中。适配器对象需实现以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const : = { : () => { if (!()) { // 在此配置替代存储方案 return null } return ..() }, : (, ) => { if (!()) { // 在此配置替代存储方案 return } ..(, ) }, : () => { if (!()) { // 在此配置替代存储方案 return } ..() },}

您还可以配置客户端库在成功重定向后自动兑换会话。只需将 detectSessionInUrl 选项设为 true 即可。

完整配置示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const = ('https://xyzcompany.supabase.co', 'public-anon-key', { // ... : { // ... : true, : 'pkce', : { : () => .('FETCHED_TOKEN'), : () => {}, : () => {}, }, }, // ...})

限制条件

在底层实现中,代码交换需要一个代码验证器(code verifier)。URL中的代码和代码验证器都需要发送回Auth服务器才能成功完成交换。

代码验证器在Auth流程首次启动时创建并存储在本地。这意味着代码交换必须在启动流程的同一浏览器和设备上发起。

相关资源