在Angular 2应用程序中,我正在使用JWT对用户进行身份验证。令牌返回给客户端,然后存储在localStorage中。
我想保护某些Angular路由,以便只有登录用户才能访问它们。
到目前为止,当令牌返回时,我在配置服务中设置变量isAuthenticated
,并使用它来决定用户是否可以导航到受保护的路由。但是这个变量当然不会在刷新页面后持续存在。所以我删除了isAuthenticated
,而是在决定是否允许用户访问受保护的路由之前,检查令牌是否存在(并且尚未过期)。
我正在使用Angular的路由器模块来处理路由,并使用canActivate挂钩来查看用户是否经过身份验证/登录。
app.module:
{ path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] }
// ... other routes
然后是AuthGuard(基本上如果存在令牌并且它没有过期,则激活路线):
canActivate() {
let base64Url = localStorage.getItem('token').split('.')[1];
let base64 = base64Url.replace('-', '+').replace('_', '/');
let token = JSON.parse(window.atob(base64));
let now = new Date().getTime();
return (localStorage.getItem('token') && token.exp > now) ? true : false;
}
我的问题是,我想假冒JWT令牌以获取对Angular路线的访问权限是微不足道的,但我不想仅仅因为用户导航到另一个页面而进行API调用。那么这个实现是最好的方法吗?必要的API调用(GET,POST,PUT,DELETE等)仍将通过授权过程,因此它只是容易受到攻击的前端路由。
这是正常做法,还是我应该使用另一种方法?我绝对不想通过网站安全重新发明轮子。