问题描述
当我通过 Angular 调用 api 时出现此错误。但是,当我通过 Postman 调用它时,我得到了想要的响应。我不知道我做错了什么。以下是我使用的代码:
generatetoken() {
let serverUIUri: string;
const sessionState = sessionStorage.getItem('state');
if (sessionState === undefined || sessionState !== this.state) {
this.router.navigate(['/account/login']);
} else {
this.userService.tokenGeneration("SSO",'authorization_code','http://localhost:4200',this.code).subscribe((response: any) => {
sessionStorage.setItem('demo_cookiee',response.accesstoken);
this.router.navigate(['/']);
},error => {
this.continuetoAppSelection();
//this.router.navigate(['/account/login']);
});
}
}
tokenGeneration(clientId: any,authorizationCode: any,redirectUri: any,code: any): Observable<any> {
const options = {
headers: new HttpHeaders()
.append('Content-Type','application/x-www-form-urlencoded'),withCredentials: true,origin: 'http://localhost:4200/',referer: 'http://localhost:4200/'
};
const body = {
grant_type: authorizationCode,redirect_uri: redirectUri,client_id: clientId,code: code
}
return this.demohttp.postData(this.url + 'connect/token',options,body);
}
postData(url: string,headers: any,body: any): Observable<any> {
return this.http.post(url,body,headers);
}
我也将 Body 和 Header 中的相同参数传递给邮递员。在那里它成功地得到了回应。但是,通过代码它给出了以下错误:
Object {error: "invalid_request",error_description: "The mandatory 'grant_type' parameter is missing."}
我将 grant_type 作为“authorization_code”传递,但它仍然给出错误。知道我做错了什么吗?
解决方法
我假设您正在使用某种形式的 OIDC/OAuth2 服务。如果您查看规范 here,则必须使用 FormData 发布参数,而不是作为请求的正文。
可能就是这个区别。
猜猜它应该看起来像这样(未经测试,从我的脑海中浮现 - 如果失败,请参阅现有的 SO 问题/教程)。
tokenGeneration(clientId: any,authorizationCode: any,redirectUri: any,code: any): Observable<any> {
const options = {
headers: new HttpHeaders()
.append('Content-Type','application/x-www-form-urlencoded'),withCredentials: true,origin: 'http://localhost:4200/',referer: 'http://localhost:4200/'
};
const form = new FormData();
form.append('grant_type',authorizationCode);
form.append('redirect_uri',redirectUri);
form.append('client_id',clientId);
form.append('code',code);
return this.demohttp.postData(this.url + 'connect/token',form,options);
}
,
我纠正了这个问题,body 对象被正确创建,因此我收到错误缺少必需的“grant_type”参数。。但是在修复 body 对象后,它工作得很好。
ALTER TABLE "tableName"
ALTER "price" TYPE double precision USING price::double precision,ALTER "price" DROP DEFAULT,ALTER "price" SET NOT NULL;