Javascript Cookie中令牌的角度保护路由

Javascript Cookie中令牌的角度保护路由,javascript,angular,cookies,jwt,local-storage,Javascript,Angular,Cookies,Jwt,Local Storage,我通常将用户令牌保存在本地存储中。我检查本地存储中的“令牌”密钥作为CanActivate方法来保护一些路由。如果密钥在那里,我让用户登陆页面,否则我重定向到登录页面 现在我使用cookies来存储auth令牌。令牌在服务器登录时直接存储在cookie中(设置cookie,secure:true,httpOnly:true) 由于httpOnly,我无法检查令牌是否从js存储,并且我不知道如何保护我的路由。我怎样才能像以前一样完成类似的操作?我是否应该在登录时将某些内容保存在本地存储中,然后检查

我通常将用户令牌保存在本地存储中。我检查本地存储中的“令牌”密钥作为CanActivate方法来保护一些路由。如果密钥在那里,我让用户登陆页面,否则我重定向到登录页面

现在我使用cookies来存储auth令牌。令牌在服务器登录时直接存储在cookie中(设置cookie,secure:true,httpOnly:true)


由于httpOnly,我无法检查令牌是否从js存储,并且我不知道如何保护我的路由。我怎样才能像以前一样完成类似的操作?我是否应该在登录时将某些内容保存在本地存储中,然后检查密钥是否存在?我可以检查密钥是否以某种方式存储在cookie中吗?

您可以使用NPM软件包ngx cookie服务

npm install ngx-cookie-service
在你的app.module中

import { CookieService } from 'ngx-cookie-service';
在组件中

constructor(private cookieService: CookieService) {}
…
public ngOnInit() {
    this.cookieService.set('cookie-name','cookie value');
    let cookieValue = this.cookieService.get('cookie-name');
}


关于

当我得到第一个登录响应时,我将令牌返回给客户端,并设置httponly cookie,我解析我只返回一次的令牌,我只存储令牌的有效负载,而不是整个令牌,它具有用户id和过期日期,并在我的防护中使用它作为标志进行检查。 我还有一个httpinterceptor,它检查401个错误,这些错误会重新路由到登录。 因此,如果它过期,我会将本地存储设置为null,或者如果我遇到401错误,我也会将存储的用户标识和过期日期设置为null

您将发现httponly cookie最糟糕的部分实际上是向服务器发送一个注销请求,使服务器端的cookie过期,并且还有一个黑名单,其中保存了模型中的令牌和用户ID,这样您就知道,一旦您注销,您就可以保存该令牌


另一个问题是令牌的刷新,请确保将第一个令牌的exp时间保持在5分钟左右,并在需要时刷新

为什么要改变一些有效的东西?因为将jwt存储在本地存储中比将其存储为Cookie更不安全。这是一个大胆的说法,我能知道你从哪里得到的吗?此外,存储在Cookie中也是一项要求。因此,我需要通过这种方式来实现这一点:客户端无法访问HttpOnly cookie,这是将令牌保留在cookie中以便脚本无法读取令牌的主要原因。使用角度保护时,是否只需检查是否存在用户id以及当前时间是否小于或大于过期时间即可返回值(正确,重定向URL或其他适当的响应)发送给guard?另外,在用户注销后使用token/userID维护黑名单有什么意义?