PKCE流程
关于使用PKCE流程进行身份验证
代码交换证明密钥(PKCE)流程是用户进行身份验证的两种方式之一,您的应用可通过此流程获取必要的访问令牌和刷新令牌。
虽然Supabase Auth已为您处理了该流程的实现细节,但理解PKCE与隐式流程之间的区别,对于理解纯客户端与服务端身份验证的差异至关重要。
工作原理
验证成功后,用户会被重定向回您的应用,URL格式如下:
1https://yourapp.com/...?code=<...>
其中 code
参数通常称为授权码(Auth Code),可通过调用 exchangeCodeForSession(code)
方法兑换为访问令牌(access token)。
出于安全考虑,该授权码有效期为5分钟且只能兑换一次访问令牌。如需获取新的访问令牌,您需要重新启动完整的认证流程。
由于该流程在服务端运行,localStorage
可能不可用。您可以通过配置 storage
选项来使用自定义存储适配器,例如将数据存储在cookie中。适配器对象需实现以下方法:
1234567891011121314151617181920212223const : = { : () => { if (!()) { // 在此配置替代存储方案 return null } return ..() }, : (, ) => { if (!()) { // 在此配置替代存储方案 return } ..(, ) }, : () => { if (!()) { // 在此配置替代存储方案 return } ..() },}
您还可以配置客户端库在成功重定向后自动兑换会话。只需将 detectSessionInUrl
选项设为 true
即可。
完整配置示例如下:
1234567891011121314const = ('https://xyzcompany.supabase.co', 'public-anon-key', { // ... : { // ... : true, : 'pkce', : { : () => .('FETCHED_TOKEN'), : () => {}, : () => {}, }, }, // ...})
限制条件
在底层实现中,代码交换需要一个代码验证器(code verifier)。URL中的代码和代码验证器都需要发送回Auth服务器才能成功完成交换。
代码验证器在Auth流程首次启动时创建并存储在本地。这意味着代码交换必须在启动流程的同一浏览器和设备上发起。
相关资源
- OAuth 2.0指南关于PKCE流程