我读到使用JSon Web Token时我们不需要在数据库中存储任何东西。然后我们可以在不查看数据库的情况下获取用户的id。怎么可能?
答案 0 :(得分:2)
解码JWT时,有效负载由多个“声明”组成。 (=属性)。 在oAuth或OpenIdConnect中,'sub'声明唯一地标识被查询系统中的用户。所以,这可以看作是你提出的ID。
这是非常非常短的版本......
希望这有帮助
答案 1 :(得分:0)
嘿,检查一下 https://developers.google.com/accounts/docs/OAuth2ServiceAccount#creatingjwt 可能会让你知道它是如何运作的。
答案 2 :(得分:0)
验证 Jwt 中间件类中的令牌,在每个授权请求中调用方法
JwtMiddleware
{
private readonly RequestDelegate _next;
private readonly TokenValidationParameters _tokenValidationParams;
public JwtMiddleware(RequestDelegate next, TokenValidationParameters
tokenValidationParams)
{
_next = next;
_tokenValidationParams = tokenValidationParams;
}
public async Task Invoke(HttpContext context)
{
try{
var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
var jwtTokenHandler = new JwtSecurityTokenHandler();
// Validation 1 - Validation JWT token format
var tokenInVerification = jwtTokenHandler.ValidateToken(token, _tokenValidationParams, out var validatedToken);
if (validatedToken is JwtSecurityToken jwtSecurityToken)
{
var result = jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase);
if (result == false)
{
Error Invalid = new Error()
{
Success = false,
Errors = "Token is Invalid"
};
context.Items["Error"] = Invalid;
}
}
}
catch (Exception ex)
{
Error Invalid = new Error()
{
Success = false,
Errors = "Token does not match or may expired."
};
context.Items["Error"] = Invalid ; // userService.GetById(userId);
}
await _next(context);
}
}