0

您好我正在尝试创建一个 GAE/J 应用程序,我必须在其中从给定代码中检索访问令牌

所以这是我的 /oauth2callback servlet 代码

public class OAuth2Callback extends HttpServlet{

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
    String url = "https://accounts.google.com/o/oauth2/token";

        // FetchOptions opt = FetchOptions.Builder.doNotValidateCertificate();
           URL url1=new URL(url); 
           String param="grant_type=authorization_code&code="+req.getParameter("code")+"&client_id=anonymouns&client_secret=anonymous&redirect_uri=https://www.cloudspokestest.appspot.com/oauth2callback";

   HttpURLConnection connection = 
        (HttpURLConnection)url1.openConnection(); 
             connection.setDoOutput(true); 
             connection.setRequestMethod("POST"); 
             connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
             connection.getOutputStream().write( param.getBytes() ); 
          InputStream str= connection.getInputStream();
          BufferedReader reader=new BufferedReader(new InputStreamReader(str));
        String l="";
          while((l=reader.readLine())!=null){
              resp.getWriter().println(l);

          }


    }

}

但在浏览器屏幕上,我收到错误无效授权,响应代码为 400。任何人都可以帮助如何消除此错误。

4

1 回答 1

0

您很可能会收到此错误,因为您的 url 中的参数值不是 url 编码的。的值redirect_uri和可能的值code必须是 url 编码的。

您可以使用 java.net.URLEncoder 对值进行编码。

也永远不要getBytes()在字符串上使用,因为它使用您平台的默认字符编码将字符转换为字节。在另一台机器上运行相同的代码,或更改您的机器配置可能会产生不同的输出。始终使用getBytes(charsetname)

于 2012-07-04T13:47:10.910 回答