如何检查用户是否已通过angular

时间:2018-10-29 08:08:18

标签: angular oauth-2.0 angular2-routing

我有一个使用oAuth的角度应用程序,用于检查用户是否有效。 AuthGuard和AuthService负责将用户路由到第三方登录页面,一旦向用户颁发了令牌,他便被路由回到有角度的应用程序,在其中通过对节点API的REST调用来验证令牌。如果令牌有效,则令牌将保存在sessionStorage中,并且用户已登录。

下面的所有路由都具有AuthGuard,因此,每次用户登录后尝试呈现页面时,AuthService都会将该令牌发送给API以检查其有效性。当用户已经登录时,如何在呈现每个路由之前避免进行API调用以进行令牌验证。

{
    path: '',
    component: LoginComponent,
  },
  {
    path: 'user',
    component: UserComponent, 
    canActivate: [AuthGuard]
  },
  {
    path: 'dashboard',
    component: dashboardComponent,
    canActivate: [AuthGuard],
    children: [
      {
        path: '',
        loadChildren: './other-layout/other-layout.module#otherModule'
      }
    ]
  }

下面是AuthGuard代码:

@Injectable()
export class AuthGuard implements CanActivate {

  params: any;

  constructor(private auth: AuthService,
    private router: Router,
    private route: ActivatedRoute){
  }
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {


    return new Promise((resolve, reject)=>{
      let authenticated = this.authService.handleAuthentication()

      authenticated.then((result) =>{
        if(result){
          resolve(true);
        }else{
          console.log('Authenication failed. User is being routed to third party site for authentication')
          this.authService.routeForOAuth();
          reject(false);
        }
      })
    })  
  }
}

AuthService代码:

  public handleAuthentication(): any {
    return Promise((resolve, reject)=>{
      if (window.location.hash.includes("access_token")){

        let windowlocation = window.location.hash.split('&');
        this.validateToken(windowlocation[0].split('=')[1],(result) => {  
            resolve(result);
        })
      } else if (sessionStorage.getItem('access_token') != null){
        this.validateToken(sessionStorage.getItem('access_token'), (result) => {              
            resolve(result);    
        })

      } else{
          resolve(false);
      }
    })
  }

2 个答案:

答案 0 :(得分:1)

就像将令牌保存在会话存储中一样,您也可以保存用户已登录的事实。但这并不是很安全,因为用户可以找到您如何将数据存储在本地存储中并根据需要进行修改。

您可以考虑使用令牌的存在作为担保一段时间的事实,这意味着您可以检查令牌是否存在,然后考虑用户已登录,并且每隔几分钟便过期一次,因此您必须重新检查然后进行身份验证。这取决于您希望系统的坚固程度。

不过,最佳实践恕我直言是获取令牌,将其用于authGuard canActivate,并像已经做的那样使用oauth2保护端点。这样,即使有人发现了如何“破解”您的本地存储使用情况,由于您的端点受到保护,他仍将无法访问您的数据。他只会得到一个错误页面,其中未完成通话。如果您有需要保护的静态内容,而没有通过http调用从服务器获取,则可以考虑在authGuard上使用身份验证调用。

希望有帮助

答案 1 :(得分:0)

据我所知,最佳做法是为每个路由调用API以检查令牌是否经过验证。这就是AuthGuard的用途。这是检查令牌是否正确的唯一方法。

否则,您可以签入canactivate方法,以确保如果令牌在sessionstorage中存在,则不要进行API调用。但是,再次建议不要使用这种方法。