如何知道访问令牌已过期?

时间:2017-09-08 11:09:04

标签: access-token identityserver4

客户端应该如何知道访问令牌已过期,以便他使用刷新令牌发出请求以获取另一个访问令牌?

如果答案是服务器API将返回401,那么API如何知道访问令牌已过期?

我正在使用IdentityServer4。

1 个答案:

答案 0 :(得分:2)

如果包含的承载令牌已经过期,您的api应拒绝任何呼叫。对于webapi应用,IdentityServerAuthenticationOptions将完成工作。

但是您的调用者Web应用程序负责保持您的access_token存活。例如,如果您的Web应用程序是ASP.Net核心应用程序,则可以使用AspNetCore.Authentication.Cookies对任何请求进行身份验证。在这种情况下,您可以通过OnValidatePrincipal事件找到有关令牌过期信息的信息。

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "Cookies",
    //ExpireTimeSpan = TimeSpan.FromSeconds(100),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    Events = new CookieAuthenticationEvents()
    {
        OnValidatePrincipal = async x =>
        {
            if (x.Properties?.Items[".Token.expires_at"] == null) return;
            var now = DateTimeOffset.UtcNow;

            var tokenExpireTime = DateTime.Parse(x.Properties.Items[".Token.expires_at"]).ToUniversalTime();
            var timeElapsed = now.Subtract(x.Properties.IssuedUtc.Value);
            var timeRemaining = tokenExpireTime.Subtract(now.DateTime);

            if (timeElapsed > timeRemaining)
            {
                //Get the new token Refresh the token
            }
        }
    }
}

我添加了一个关于如何使用另一个StackOverflow answer中的刷新令牌获取新访问令牌的完整实现