无法使用java从yahooAPI获取OAuth2.0 accessToken

无法使用java从yahooAPI获取OAuth2.0 accessToken,java,servlets,oauth-2.0,yahoo-api,Java,Servlets,Oauth 2.0,Yahoo Api,我正在使用java开发人员指南实现YahooOAuth2.0 在第四步中,它说要将授权代码交换为访问令牌,我得到一个类似“无效请求”的响应 在指南中,他们提到以base64编码格式包含consumerKey和ConsumerCret作为响应头 我也包括了这一点,但我不确定这是否会导致无效响应 我已经错过了一些有人能帮我摆脱困境的地方 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr

我正在使用java开发人员指南实现YahooOAuth2.0

在第四步中,它说要将授权代码交换为访问令牌,我得到一个类似“无效请求”的响应

在指南中,他们提到以base64编码格式包含consumerKey和ConsumerCret作为响应头

我也包括了这一点,但我不确定这是否会导致无效响应

我已经错过了一些有人能帮我摆脱困境的地方

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/helloWorld")
public class helloWorld extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static String gUri ="";
    private static String contactsUri="";
    private static String yahooServer="";
    private static String consumer_key = "foo";

    private static String redirect_uri = "https://foo/TestServlet/helloWorld?a=process";
    private static String consumer_secret = "foo";
    private static String encodedValue="";

    public helloWorld() {
        super();
    }
    public void init(ServletConfig config) throws ServletException
    {
        super.init(config); 
    }

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();

    String action = request.getParameter("a");
    try {
        if (action.equals("init")) {
            String url = "https://api.login.yahoo.com/oauth2/request_auth?client_id="
                    + consumer_key
                    + "&redirect_uri="
                    + redirect_uri
                    + "&response_type=code&language=en-us";
            pw.println(url);
            response.sendRedirect(url);
        } else if (action.equalsIgnoreCase("process")) {
            String code = request.getParameter("code");
            System.out.println("code::::" + code);
            System.out.println("helloWorld:doPost:requesturl:" + request.getQueryString());
            doPost(request, response);
        }else if(action.equalsIgnoreCase("getAccessToken")){

            System.out.println("helloWorld:doGet:accessToken" +request.getAttribute("access_token") );
            System.out.println("helloWorld:doGet:accessToken" +request.getParameter("access_token") );
        }
        else{
            System.out.println("helloWorld:doGet:else" );
        }

    }finally {
        pw.close();
    }

}


protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String code = request.getParameter("code");
    redirect_uri="https://foo/TestServlet/helloWorld?a=getAccessToken";
    String getAccessToken="https://api.login.yahoo.com/oauth2/get_token?client_id="
                            +consumer_key
                            +"&client_secret="
                            +consumer_secret
                            +"&redirect_uri="
                            +redirect_uri
                            +"&code="
                            +code
                            +"&grant_type=access_token";
    encodedValue=encoder.encode(consumer_key+":"+consumer_secret);
    System.out.println("helloWorld:doPost:encodedVAlue-->" +encodedValue );
    response.setHeader("Authorization:","Basic"+encodedValue);
    response.setHeader("Content-Type:","application/x-www-form-urlencoded");

    System.out.println("helloWorld:doGet:contactsUri" +getAccessToken );
    response.sendRedirect(getAccessToken);
   }
  }

您需要将参数作为HTTP POST请求中的表单编码参数发布到令牌端点(
oauth2/get_token
),而不是在重定向到令牌端点的过程中将其作为查询参数提供。您可以使用来自的代码

此外,请注意:

  • Basic
    encodedValue
  • setHeader
    方法将
    添加到头本身,您不需要在第一个参数中提供它
  • 但是1。二,。与实际的解决方案代码无关,因为您不应该在对调用方的HTTP响应上设置头,而是在对Yahoo的HTTP请求上设置头