You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:50:02