Angular 7.1.3:post 不适用于授权持有人令牌
Angular 7.1.3 : post not work with Authorization Bearer token
我是 Angular 的新手,我正在使用 Angular 7.1.3
我通过 Angular HTTP 成功登录到我的 Laravel 5.7 Passport API 系统并获取访问令牌并存储在 cookie 中。
现在我想使用访问令牌简单地获取数据,但我无法获取数据,它给出了 302 重定向错误:
我的 auth.service.ts 代码是:
import { Injectable } from '@angular/core';
import {HttpClient, HttpHeaders} from "@angular/common/http";
import { GlobalvarsService } from "./globalvars.service";
import { Cookie } from 'ng2-cookies/ng2-cookies';
import {Router} from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private http : HttpClient, private globvar : GlobalvarsService, private router : Router) { }
details(){
const httpOptions = {
headers: new HttpHeaders({
'Content':'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization' : 'Bearer '+ Cookie.get('access_token')
}),
};
let input = new FormData();
this.http.get(mypath + 'api/details',httpOptions).subscribe(
data => {
console.log('dddddddd');
console.log(data);
},
error => {
}
)
}
注:mypath
是我的URL
我的代码有什么问题?没有设置 POST
发送请求时设置 OPTIONS
的方法。
这称为预检请求,由于跨源资源共享 - 简称 CORS - 策略,由浏览器强制执行。您无法直接控制它。
如果可以执行所需的请求,则向服务器发出预检请求 "ask"。当您尝试提出的请求被视为 "not simple" 时,它就完成了。关于这意味着什么,你可以看到 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests
所以在某些情况下这是预期的行为。如果您向应用程序所在的同一域发出请求,则不会进行预检。如果您对外部资源发出非简单请求,则会应用 CORS 并询问 'question'。从应用的角度来看,如果你不想预检,你只能把你的请求改成简单的。
到基地,那个代码有什么臭味:
- 您根据
GET
请求设置了 Content-Type
。为什么? GET
没有内容,所以没有类型
Content
header 可能被认为是自定义的,这会导致预检发生。我只假设您希望 Accept
header 表示您希望响应为 json
- 如果您在 cookie 中有您的身份验证令牌,为什么要用 header 发送它?您最终会收到两次具有相同数据的请求 - 在 cookie 和 headers.
中
- 通常,将授权数据附加到请求是使用 http 拦截器完成的,因此它是针对每个请求完成的,而不需要手动将这些数据添加到每个请求(就像你尝试做的那样)https://angular.io/guide/http#intercepting-requests-and-responses
我是 Angular 的新手,我正在使用 Angular 7.1.3 我通过 Angular HTTP 成功登录到我的 Laravel 5.7 Passport API 系统并获取访问令牌并存储在 cookie 中。
现在我想使用访问令牌简单地获取数据,但我无法获取数据,它给出了 302 重定向错误:
我的 auth.service.ts 代码是:
import { Injectable } from '@angular/core';
import {HttpClient, HttpHeaders} from "@angular/common/http";
import { GlobalvarsService } from "./globalvars.service";
import { Cookie } from 'ng2-cookies/ng2-cookies';
import {Router} from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class AuthService {
constructor(private http : HttpClient, private globvar : GlobalvarsService, private router : Router) { }
details(){
const httpOptions = {
headers: new HttpHeaders({
'Content':'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization' : 'Bearer '+ Cookie.get('access_token')
}),
};
let input = new FormData();
this.http.get(mypath + 'api/details',httpOptions).subscribe(
data => {
console.log('dddddddd');
console.log(data);
},
error => {
}
)
}
注:mypath
是我的URL
我的代码有什么问题?没有设置 POST
发送请求时设置 OPTIONS
的方法。
这称为预检请求,由于跨源资源共享 - 简称 CORS - 策略,由浏览器强制执行。您无法直接控制它。
如果可以执行所需的请求,则向服务器发出预检请求 "ask"。当您尝试提出的请求被视为 "not simple" 时,它就完成了。关于这意味着什么,你可以看到 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests
所以在某些情况下这是预期的行为。如果您向应用程序所在的同一域发出请求,则不会进行预检。如果您对外部资源发出非简单请求,则会应用 CORS 并询问 'question'。从应用的角度来看,如果你不想预检,你只能把你的请求改成简单的。
到基地,那个代码有什么臭味:
- 您根据
GET
请求设置了Content-Type
。为什么?GET
没有内容,所以没有类型 Content
header 可能被认为是自定义的,这会导致预检发生。我只假设您希望Accept
header 表示您希望响应为json
- 如果您在 cookie 中有您的身份验证令牌,为什么要用 header 发送它?您最终会收到两次具有相同数据的请求 - 在 cookie 和 headers. 中
- 通常,将授权数据附加到请求是使用 http 拦截器完成的,因此它是针对每个请求完成的,而不需要手动将这些数据添加到每个请求(就像你尝试做的那样)https://angular.io/guide/http#intercepting-requests-and-responses