Bearer Token 和 Refresh Token 有什么区别?

3
在ServiceStack中,我正在使用JwtAuthProvider,其中我获得了Bearer令牌和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个回答

2
请查看关于JWT刷新令牌目的的文章。
总之,BearerToken是实际的JWT,用于通过JWT进行身份验证。它包含用户会话的无状态快照,通常是短暂的令牌,在过期后需要联系认证服务器获取新的JWT令牌。
RefreshToken是一个更长寿的令牌,可用于透明地请求新的JWT令牌(即不强制用户手动重新验证),并将填充最新的用户会话快照。
JWT BearerTokens的生命周期越短,存储在JWT中的无状态会话信息就越不陈旧,但RefreshToken需要更频繁地使用以获取更新的BearerToken。只有在请求新的BearerToken之后,诸如角色和权限是否被锁定等会话信息才会被更新。
每个令牌的生命周期可以通过ExpireTokensInExpireRefreshTokensIn JwtAuthProvider属性进行配置。

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

ServiceStack的服务客户端会自动处理使用RefreshTokens透明地获取新的JWT令牌。您通常会在初始化服务客户端时填充BearerToken和RefreshToken,例如:

var authResponse = authClient.Send(new Authenticate());

var client = new JsonServiceClient(baseUrl) {
    BearerToken = authResponse.BearerToken,
    RefreshToken = authResponse.RefreshToken,
};

需要使用BearerToken来进行请求,不过由于服务客户端自动使用配置的RefreshToken获取新的JWT令牌,因此您只需要填写RefreshToken即可。
var client = new JsonServiceClient(baseUrl) {
    RefreshToken = authResponse.RefreshToken,
};

由于ServiceStack会在第一次使用时自动获取新的JWT令牌,但您可以通过填充两者来节省往返时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接