在ServiceStack中,我使用JwtAuthProvider,我获得了Bearer Token和Refresh令牌,那么如何验证令牌并授权web api服务? 代码:
var client = new JsvServiceClient(ListeningOn) { UserName = "tuser", Password = "password" };
client.Send<AssignRolesResponse>(new AssignRoles
{
UserName = "tuser",
Roles = new ArrayOfString("TestRole"),
Permissions = new ArrayOfString("GetStatus")
});
var jwtToken = client.Send(new Authenticate()).BearerToken;
在这里,'jwtToken'值的用途是什么?用户已经过授权和身份验证,所以我不明白为什么需要令牌?
有人可以建议我如何利用该令牌? JWT配置:
this.Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[]
{
new JwtAuthProvider(AppSettings) {
RequireSecureConnection = false,
AuthKey = AesUtils.CreateKey(),
//CreatePayloadFilter = (payload,session) =>
// payload["CreatedAt"] = session.CreatedAt.ToUnixTime().ToString(),
CreatePayloadFilter = (jwtPayload, session) =>
jwtPayload["exp"] = DateTime.UtcNow.AddSeconds(-1).ToUnixTime().ToString()
},
new CredentialsAuthProvider(AppSettings),
new BasicAuthProvider()
}));
答案 0 :(得分:1)
请参阅purpose of JWT Refresh Tokens上的这篇文章。
总之,BearerToken
实际JWT以及用于通过JWT进行身份验证的内容。它包含用户会话的无状态快照,通常是一个短期令牌,在它到期后需要联系Auth服务器以获取新的JWT令牌。
RefreshToken
是longer-lived token,可用于透明地请求新的JWT令牌(即不强制用户手动重新验证),并将填充用户会话的最新快照。
JWT BearerTokens的生命周期越短,JWT中存储的无状态会话信息越不陈旧,但刷新Token需要用于获取更新的BearerToken的次数越多。只有在请求新的BearerToken之后,才会有会话信息,例如角色和权限,或者是否已将其锁定。
每个令牌的生命周期可使用ExpireTokensIn
和ExpireRefreshTokensIn
JwtAuthProvider属性进行配置。
ServiceStack的服务客户端会自动处理transparently fetching new JWT Tokens using RefreshTokens。在初始化服务客户端时,通常会填充BearerToken和RefreshToken,例如:
var authResponse = authClient.Send(new Authenticate());
var client = new JsonServiceClient(baseUrl) {
BearerToken = authResponse.BearerToken,
RefreshToken = authResponse.RefreshToken,
};
发出请求需要BearerToken
,但由于Service Client会自动使用已配置的RefreshToken获取新的JWT令牌,因此您只需要填充RefreshToken
:
var client = new JsonServiceClient(baseUrl) {
RefreshToken = authResponse.RefreshToken,
};
由于ServiceStack会在首次使用时自动获取新的JWT令牌,但您可以通过填充两者来保存往返。