AADSTS90014:请求正文必须包含以下参数:' grant_type'

时间:2018-03-06 11:02:45

标签: oauth-2.0 angular5

我正在尝试发送帖子请求以从https://login.microsoftonline.com/common/oauth2/v2.0/token接收我的访问令牌。当我在我的REST客户端中尝试此操作时,它可以正常工作,但当我尝试将其集成到我的应用程序时,它会向我发送错误400 Bad Gateway,并显示消息AADSTS90014: The request body must contain the following parameter: 'grant_type'。我试着寻找答案,并发现我需要在我的帖子请求中实现标题,所以我这样做了,但它仍然无法工作。有什么想法吗?

Http进口: import { HttpClient, HttpHeaders, HttpRequest } from '@angular/common/http';

致电发布请求:

var url=this.outlook_authentification_endpoint+"token";
var query_parameters=JSON.stringify({grant_type:"authorization_code", client_id:this.outlook_client_id, code: this.outlook_user_code, client_secret: this.outlook_secret_key, redirect_uri: this.outlook_redirect_uri});
const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type':  'application/x-www-form-urlencoded'
  })
};
this.query_service.postOutlook(url, query_parameters, httpOptions, (data)=>
{   
  console.log(data);
});

调用帖子功能:

public postOutlook(url, query, headers, callback)
  {
    this.operation_pending=true;
    this.http_client.post(url,query, headers).subscribe((data)=>
    {
      this.operation_pending=false;
      callback(data);
    });
  }

任何人都可以看到我的错误在哪里吗?

1 个答案:

答案 0 :(得分:0)

您正在使用错误的OAuth2流程(获取令牌的方式)。您使用的Auth code grant无法在浏览器应用程序中使用,因为您必须在JavaScript中保密您的客户端,这意味着将其公开。因此,您无法访问/token端点。

您应该使用专为浏览器应用程序设计的Implicit grant。然后,您可以将令牌直接放入Angular应用程序中,而无需转到/token端点。