获取 OAuth 会话的过期时间

本文关键字:过期 时间 会话 OAuth 获取 | 更新日期: 2023-09-27 17:56:33

要授予或撤销对我的webapis的访问权限,我使用OAuth密码和令牌刷新工作流。

如果我正确理解了所有内容,工作流程应该是这样的:

  1. 使用用户名/密码/客户端ID进行身份验证
  2. 检索访问令牌、刷新令牌和到期日期
  3. 在客户端中启动超时以在令牌时间过期后刷新令牌
  4. 继续使用项目符号 2 ->,依此类推。

到目前为止,上述进展良好。我的问题是,在身份验证请求后,我没有从用户原则中获得过期时间。因此,如果我使用 stateles 网络客户端,我需要在每个请求中更新我的令牌以检索新的到期日期,即使用户令牌有效:/

我想要的是类似于/api/session/information 服务的东西,它提供有关经过身份验证的用户的当前会话的一般信息。

如何检索我的到期日期 =)

[HttpGet]
[ActionName("information")]
public HttpResponseMessage Information(BaseRequest request)
{
    var p = Request.GetRequestContext().Principal;
    /* here i need help =) */
}

获取 OAuth 会话的过期时间

只是为了稍微扩展一下Henrik N.的答案。如果您使用的是 C#,则可以在 System.IdentityModel.Tokens.Jwt (Nuget: Install-Package System.IdentityModel.Tokens.Jwt ) 中使用 JWTSecurityTokenHandler 来读取令牌,生成的 JwtSecurityToken 对象为您提供了一些方便的属性,其中一个是 ValidTo 它将exp声明转换为DateTime对象,例如:

var tokenString = GetTokenString(); // Arbitrary method to get the token
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadToken(tokenString) as JwtSecurityToken;
var tokenExpiryDate = token.ValidTo;
// If there is no valid `exp` claim then `ValidTo` returns DateTime.MinValue
if(tokenExpiryDate == DateTime.MinValue) throw new Exception("Could not get exp claim from token");
// If the token is in the past then you can't use it
if(tokenExpiryDate < DateTime.UtcNow) throw new Exception($"Token expired on: {tokenExpiryDate}");
// Token is valid

您的访问令牌(JWT?)应包含到期声明。在 JWT 中,它是"exp",它显示了自 1970-1-1 以来的秒数。在javascript中,你可以像这样得到一个日期:

new Date(<exp> * 1000);

在.Net/C#中,您可以执行相同的操作:

var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(<exp>);

这就是你要找的吗?否则请告诉我。很乐意帮助:-)

您可以使用

DateTimeOffset.FromUnixTimeSeconds:

   var jwtExpValue = long.Parse(principal.Claims.FirstOrDefault(x => x.Type == "exp").Value);
   DateTime expirationTime = DateTimeOffset.FromUnixTimeSeconds(jwtExpValue).DateTime;