代码之家  ›  专栏  ›  技术社区  ›  tika

承载令牌和刷新令牌有什么区别?

  •  3
  • tika  · 技术社区  · 7 年前

    在ServiceStack中,我使用JwtAuthProvider,在那里我获得了承载令牌和刷新令牌,那么如何验证令牌并授权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 回复  |  直到 7 年前
        1
  •  2
  •   mythz    7 年前

    请参阅 purpose of JWT Refresh Tokens .

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

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

    JWT BeareToken的生存期越短,存储在JWT中的无状态会话信息就越不陈旧,但获取更新的BeareToken时需要使用RefreshToken的频率就越高。只有在请求一个新的BeareToken之后,会话信息,例如角色和权限,或者它们是否被锁定。

    每个令牌的生存期可通过 ExpireTokensIn ExpireRefreshTokensIn JwtAuthProvider属性。

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

    ServiceStack的服务客户端自动处理 transparently fetching new JWT Tokens using RefreshTokens . 在初始化服务客户端时,通常会填充BeareToken和RefreshToken,例如:

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

    这个 贝尔托肯 虽然由于服务客户端使用配置的RefreshToken自动获取新的JWT令牌,您只需要填充 刷新令牌 :

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

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