Supabase .NET C# Web API:如何实现Token刷新与指定用户登出?
问题:Supabase .NET6 API中Token刷新与指定用户登出的实现
我目前正在基于Supabase开发Web API,使用.NET6(C#)并将Supabase Client以Scoped方式注入。我想了解是否可通过客户端为用户刷新Token,以及能否通过用户的Token实现登出操作。
以下是我的代码:
[HttpPost("refresh")] public async Task<IActionResult> RefreshAsync(string token) { var user = await _supabase.Auth.GetUser(token); await _supabase.Auth.RefreshSession(); return Ok(); }
如您所见,我可以通过Token获取用户,但无法为该用户刷新会话。
登出相关代码如下:
[HttpPost("logout")] public async Task<IActionResult> LogoutAsync(string token) { try { var user = await _supabase.Auth.GetUser(token); await _supabase.Auth.SignOut(); return Ok(); } catch (Exception e) { Console.WriteLine(e); throw; } }
SignOut()方法同样存在问题,我无法将指定用户作为参数传入。请问有解决思路吗?
一、Token刷新的实现
当前RefreshSession()方法是基于Supabase Client当前持有的会话刷新,而非传入token对应的会话。要实现指定用户的Token刷新,需先通过传入的Refresh Token构建会话,再触发刷新:
[HttpPost("refresh")] public async Task<IActionResult> RefreshAsync(string refreshToken) { // 用传入的Refresh Token构建目标会话 var targetSession = new Session { RefreshToken = refreshToken }; // 基于该会话刷新,获取新的会话凭证 var refreshedSession = await _supabase.Auth.RefreshSession(targetSession); // 返回新的Token信息给客户端 return Ok(new { AccessToken = refreshedSession.AccessToken, RefreshToken = refreshedSession.RefreshToken, ExpiresIn = refreshedSession.ExpiresIn }); }
注意:必须传入Refresh Token而非Access Token,Supabase的Token刷新逻辑仅接受Refresh Token触发。
二、指定用户登出的实现
Supabase .NET Client默认SignOut()是登出当前客户端绑定的会话,要实现指定用户登出,有两种方式:
方法1:直接传入Refresh Token调用登出接口
[HttpPost("logout")] public async Task<IActionResult> LogoutAsync(string refreshToken) { try { // 传入目标用户的Refresh Token执行登出 await _supabase.Auth.SignOut(refreshToken); return Ok("登出成功"); } catch (Exception e) { Console.WriteLine(e); return StatusCode(500, "登出失败"); } }
方法2:调用Revoke Token API(支持失效Access/Refresh Token)
如果需要更细粒度控制,可以直接调用Supabase的Token吊销接口:
[HttpPost("logout")] public async Task<IActionResult> LogoutAsync(string token) { try { var revokeRequest = new HttpRequestMessage(HttpMethod.Post, $"{_supabase.SupabaseUrl}/auth/v1/token?revoke=true"); revokeRequest.Headers.Add("apikey", _supabase.ApiKey); revokeRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string> { { "token", token } }); var response = await _supabase.HttpClient.SendAsync(revokeRequest); response.EnsureSuccessStatusCode(); return Ok("登出成功"); } catch (Exception e) { Console.WriteLine(e); return StatusCode(500, "登出失败"); } }
这里的token可以是Access Token或Refresh Token,接口会直接失效对应凭证。
注意事项
- Scoped注入的Supabase Client不会跨请求共享会话,所有操作都需要明确传入目标用户的Token凭证。
- 刷新Token时需注意Refresh Token的有效期,过期后需引导用户重新登录。
- 确保Supabase Client配置的
SupabaseUrl和ApiKey正确无误。
内容的提问来源于stack exchange,提问作者Alexandre Sobral Martins
相关产品推荐
相关产品推荐

