我正在尝试让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请求,从而导致问题,但我不知道是什么调用此调用。有办法看吗?
答案 0 :(得分:0)
好的,有两件事...... 首先,你说明了
“但是在新的重新加载 - 每次有人没有登录时,他们 得到401错误。“
嗯,这就是它的工作方式。如果他们没有经过身份验证,那么他们将获得401.这就是401的意思 - “需要身份验证”。
如果您的意思是,如果用户在通过身份验证时点击浏览器的“重新加载”按钮,则会获得401,这意味着您在重新加载时丢失了凭据 - 您可能希望将它们存储在本地存储中。
其次,您看到的两个请求行为是CORS正在工作(我猜测您的后端位于不同的端口,而不是4200,这使得CORS启动)。
OPTION请求是浏览器和服务器之间的协商,以查看是否允许您从CORS的角度提出GET请求。显然你是被允许的,所以GET继续,但获得401,因为需要身份验证。
这个“额外的”OPTIONS请求不在你的控制之下(或者是Angular的),它已经融入了浏览器,而这正是CORS的工作方式。