Bearer Token和Refresh Token有什么区别?

时间:2017-12-06 06:52:07

标签: servicestack jwt

在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()
                    }));

1 个答案:

答案 0 :(得分:1)

请参阅purpose of JWT Refresh Tokens上的这篇文章。

总之,BearerToken实际JWT以及用于通过JWT进行身份验证的内容。它包含用户会话的无状态快照,通常是一个短期令牌,在它到期后需要联系Auth服务器以获取新的JWT令牌。

RefreshTokenlonger-lived token,可用于透明地请求新的JWT令牌(即不强制用户手动重新验证),并将填充用户会话的最新快照。

JWT BearerTokens的生命周期越短,JWT中存储的无状态会话信息越不陈旧,但刷新Token需要用于获取更新的BearerToken的次数越多。只有在请求新的BearerToken之后,才会有会话信息,例如角色和权限,或者是否已将其锁定。

每个令牌的生命周期可使用ExpireTokensInExpireRefreshTokensIn JwtAuthProvider属性进行配置。

ServiceStack客户端内置支持JWT和刷新令牌

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令牌,但您可以通过填充两者来保存往返。