【问题标题】:Play Framework and Office 365 OAuthPlay 框架和 Office 365 OAuth
【发布时间】:2015-11-02 23:40:21
【问题描述】:

我正在编写一个与 Azure Active Directory 交互的 Play Framework 应用程序。我开始只是简单地提取一些事件,但我无法通过初始令牌刷新请求。

private static void getEventsFromOffice365(){
    System.out.println("getting from O365");

    Promise<String> promise = WS.url("https://login.microsoftonline.com/common/oauth2/token")
    .setBody("grant_type=refresh_token&refresh_token=[refresh token]&scope=openid+offline_access+https%3A%2F%2Foutlook.office.com%2Fmail.read+https%3A%2F%2Foutlook.office.com%2Fcalendars.read+https%3A%2F%2Foutlook.office.com%2Fcontacts.read&redirect_uri=https%3A%2F%2Foauthplay.azurewebsites.net%2F&client_id=[client id]&client_secret=[client secret]")
    .setContentType("application/x-www-form-urlencoded")
    .post("")
    .map(
            new Function<WSResponse, String>() {
                public String apply(WSResponse response) {
                    System.out.println("Done");
                    String result = response.getBody();
                    System.out.println("Result:" + result);
                    System.out.println("json:" + response.getStatus());

                    return result;
                }
            });
}

出于某种原因,每当我运行此程序时,我都会收到来自 Microsoft 的以下响应。

{"error":"invalid_request","error_description":"AADSTS90014:请求正文必须包含以下参数:'grant_type'。\r\n跟踪 ID:6a3c1620-6f4d-4c53-a077-cf1f842c0332\r\ n 相关 ID:0caba711-d434-4ce9-b15e-a56e27ea5a0f\r\n时间戳:2015-11-02 23:31:17Z","error_codes":[90014],"timestamp":"2015-11-02 23:31 :17Z","trace_id":"6a3c1620-6f4d-4c53-a077-cf1f842c0332","correlation_id":"0caba711-d434-4ce9-b15e-a56e27ea5a0f"}

如您所见,我在帖子正文中声明了 grant_type。为什么会出现此错误,我该如何解决?

【问题讨论】:

标签: java azure oauth playframework


【解决方案1】:

来自官方documents,您可以使用setQueryParameter 传递你的参数。我建议您可以参考以下代码:

WSRequestHolder req=WS.url("https://login.microsoftonline.com/common/oauth2/token");

  req.setQueryParameter("grant_type", refresh_token );
  req.setQueryParameter("refresh_token ", refresh_token);
  req.setQueryParameter("redirect_uri",REDIRECT_URI);
  req.setQueryParameter("scope", scope);
  req.setQueryParameter("client_secret ", client_secret);
  req.setQueryParameter("client_id ", client_id);
  req.setContentType("application/x-www-form-urlencoded")
  req.map(
            new Function<WSResponse, String>() {
                public String apply(WSResponse response) {
                    System.out.println("Done");
                    String result = response.getBody();
                    System.out.println("Result:" + result);
                    System.out.println("json:" + response.getStatus());

                    return result;
                }
            });

同时,我建议你可以尝试使用execute 方法,而不是像这样的post 方法:

. execute(“post”)

任何结果,请告诉我。

【讨论】:

  • 不幸的是,这仍然给了我相同的结果。我不得不像 req.execute("post").map(...) 那样从执行方法中调用 map
猜你喜欢
  • 1970-01-01
  • 2023-01-24
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多