Php 在邮递员中获得请求工作,但不';不能在浏览器中工作
我有一个web应用程序,它在客户端使用Php 在邮递员中获得请求工作,但不';不能在浏览器中工作,php,angular,authentication,cakephp,postman,Php,Angular,Authentication,Cakephp,Postman,我有一个web应用程序,它在客户端使用Angular7,在Api 我使用的是基本身份验证,然后我用令牌身份验证替换它,所有请求都可以正常工作,除了一个只有在邮递员中才能正常工作的请求,但在浏览器中它很奇怪,因为它似乎存在身份验证问题,但不知道原因 请求应该返回一个blob来下载文件,因此我在CakePHP中使用FPDI来返回pdf 这是邮递员的要求 邮递员标题 Date →Wed, 15 May 2019 12:02:44 GMT Server →Apache/2.4.33 (Win32) Op
Angular7
,在Api
我使用的是基本身份验证
,然后我用令牌身份验证
替换它,所有请求都可以正常工作,除了一个只有在邮递员
中才能正常工作的请求,但在浏览器中它很奇怪,因为它似乎存在身份验证问题,但不知道原因
请求应该返回一个blob来下载文件,因此我在CakePHP
中使用FPDI
来返回pdf
这是邮递员的要求
邮递员标题
Date →Wed, 15 May 2019 12:02:44 GMT
Server →Apache/2.4.33 (Win32) OpenSSL/1.0.2n PHP/5.6.35
X-Powered-By →PHP/5.6.35
Content-Disposition →inline; filename="doc.pdf"
Cache-Control →private, max-age=0, must-revalidate
Pragma →public
Access-Control-Allow-Origin →*
Keep-Alive →timeout=5, max=100
Connection →Keep-Alive
Transfer-Encoding →chunked
Content-Type →application/pdf
邮递员尸体
对Chrome的请求
使用基本身份验证的工作请求
使用FireFox
呼叫请求
getWorkListPdf(id: number, cem_id?: number) {
let uri = `${this.workSessionsUrl}workList/${id}`;
let params = new HttpParams();
if (cem_id) {
params = params.set('cemetery_id', cem_id.toString());
}
const Auth = localStorage.getItem("AuthenticationToken");
let header = new HttpHeaders();
header = header.append("AuthenticationToken", Auth);
return this.dataService.get(uri,{ headers: header, params: params, responseType: 'arraybuffer' })
.pipe(
map(res => {
return res;
}
)
);
}
非常感谢您的帮助 如果我完全理解,您希望使用承载令牌而不是基本授权进行身份验证。如果需要basic,可以在请求中使用以下标题:
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('username:password')
})
};
如果是持票人授权,您可以执行以下操作:
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + JSON.parse(your token)
})
};
希望有帮助 在您的请求中添加with credentialstrue
const httpOptions = {
headers: new HttpHeaders({
'Accept': "application/json",
'Content-Type': "text/plain;charset=UTF-8",
'Authorization': 'Bearer ' + JSON.parse(your token)
}), withCredentials: true
};
问题是
Api
无法识别包含认证所需头信息的请求,我在AppController
中添加了Authentication
数组,以允许在接收json
请求时同时使用Basic Auth
和Token Auth
,此工作适用于除此之外的所有请求(下载pdf)
我试着补充一下
$this->Auth->authenticate['Token'] = array(
'fields' => array(
),
// 'parameter' => '_token',
'header' => 'AuthenticationToken',
'scope' => array(
'User.permission_api_login' => true
)
);
再次在控制器中,它工作正常!!。似乎现在可以识别令牌并返回有效文件 请不要发布文本图像。复制文本并将其粘贴到此处,作为引用或代码(适合文本的任何内容)。@nkr我更新了帖子,但实际上我不能用代码/文本替换所有图像!它没有清晰的视图。请不要重复您自己的问题,而是更新原始问题!话虽如此,请检查chrome为什么说,这可能与问题有关。@ndm当我发布该问题时,我无法指定问题,如果问题来自
Angular
或Api
,但此问题有明确的信息,我删除了以前的问题one@ndm谢谢你的建议,我正在查看临时标题
我在应用身份验证时没有问题,但似乎此请求的令牌身份验证存在问题,请查看chrome请求,为什么请求标题
中没有身份验证令牌
,谢谢回答!但是当使用带有凭据的时:true
它只发送选项
请求,之后不发送获取请求
!对于使用Angular和php发送Cookie,我们需要添加withCredentials:true。您还必须在服务器端进行相同的更改。我对cakephp不太了解,但您可以这样做:private function setCorsHeaders(){$this->response->cors($this->request)->allowOrigin(['*')->allowMethods(['*'))->allowHeaders(['x-xsrf-token',Origin',Content Type',x-Auth-token]])->allowCredentials(['true'])->exposeHeaders(['Link'])->maxAge(300)->build();}