Angular4 Token Auth进行'auth / validate'调用

时间:2017-08-19 06:57:13

标签: angular authentication

我正在尝试让Angular2 Token Auth模块工作,但在首次加载时会出现连续的'401'错误。

我已经让auth / registration / login工作了,但是在重新加载时 - 每当有人没有登录时,他们会收到401错误。

观看网络日志我发现由于某种原因,它会进行2次validate_token次呼叫,但不存在任何令牌。第一个成功回复200 - 但第二个失败并带有401。我比较了两者,我看到的唯一区别是第二个没有content-type标题。

我的整个服务非常通用

import { Injectable } from '@angular/core';
import {Angular2TokenService} from "angular2-token";
import {Subject, Observable} from "rxjs";
import {Response} from "@angular/http";

@Injectable()
export class AuthService {

  userSignedIn$:Subject<boolean> = new Subject();

  constructor(public authService:Angular2TokenService) {

    this.authService.validateToken().subscribe(
      res => res.status == 200 ? this.userSignedIn$.next(res.json().success) : this.userSignedIn$.next(false)
    )
  }

  logOutUser():Observable<Response>{

    return this.authService.signOut().map(
      res => {
        this.userSignedIn$.next(false);
        return res;
      }
    );
  }

  registerUser(signUpData:  {email:string, password:string, passwordConfirmation:string}):Observable<Response>{
    return this.authService.registerAccount(signUpData).map(
      res => {
        this.userSignedIn$.next(true);
        return res
      }
    );
  }

  logInUser(signInData: {email:string, password:string}):Observable<Response>{

    return this.authService.signIn(signInData).map(
      res => {
        this.userSignedIn$.next(true);
        return res
      }
    );

  }

}

我相信Angular2-Token中有一些我不知道的东西导致了这个但是我不确定。我检查了后端,它没有任何请求记录。

申请失败

GET / auth / validate_token HTTP / 1.1 主持人:baseUrl 连接:保持活力 Pragma:没有缓存 缓存控制:无缓存 接受:application / json 来源:http://localhost:4200 User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,类似Gecko)Chrome / 60.0.3112.90 Safari / 537.36 Content-Type:application / json 推荐人:http://localhost:4200/ Accept-Encoding:gzip,deflate,br Accept-Language:en-US,en; q = 0.8

成功申请 OPTIONS / auth / validate_token HTTP / 1.1 主持人:baseUrl 连接:保持活力 Pragma:没有缓存 缓存控制:无缓存 访问控制请求方法:GET 来源:http://localhost:4200 User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,类似Gecko)Chrome / 60.0.3112.90 Safari / 537.36 访问控制请求标头:内容类型 接受: / 推荐人:http://localhost:4200/ Accept-Encoding:gzip,deflate,br Accept-Language:en-US,en; q = 0.8

似乎失败者正在发出GET请求,从而导致问题,但我不知道是什么调用此调用。有办法看吗?

1 个答案:

答案 0 :(得分:0)

好的,有两件事...... 首先,你说明了

  

“但是在新的重新加载 - 每次有人没有登录时,他们   得到401错误。“

嗯,这就是它的工作方式。如果他们没有经过身份验证,那么他们将获得401.这就是401的意思 - “需要身份验证”。

如果您的意思是,如果用户在通过身份验证时点击浏览器的“重新加载”按钮,则会获得401,这意味着您在重新加载时丢失了凭据 - 您可能希望将它们存储在本地存储中。

其次,您看到的两个请求行为是CORS正在工作(我猜测您的后端位于不同的端口,而不是4200,这使得CORS启动)。

OPTION请求是浏览器和服务器之间的协商,以查看是否允许您从CORS的角度提出GET请求。显然你是被允许的,所以GET继续,但获得401,因为需要身份验证。

这个“额外的”OPTIONS请求不在你的控制之下(或者是Angular的),它已经融入了浏览器,而这正是CORS的工作方式。