如何解决这个403 io异常?

时间:2016-01-27 19:17:15

标签: java google-drive-api

我想从我的应用程序向用户提供整个谷歌驱动器访问权限。 我使用以下代码从google和oauth2.0授权。

function OpenGoogleLogin()
              {   
                    var url = "https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/drive&redirect_uri=http://localhost:8080/Abc/Oauth2callback&response_type=code&client_id=xxxxxxxxxxxxxxxxxxxxxxxxxx&access_type=offline&approval_prompt=force";
                    window.location = url;
             }

从上面的代码我得到了授权码。 在重定向页面上,我将以下servlet代码

public class Oauth2callback extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Oauth2callback() {
        super();

    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        System.out.println("entering doGet");
        try {
            // get code
            String code = request.getParameter("code");
            // format parameters to post
            String urlParameters = "code="
                    + code
                    + "&client_id=xxxxxxxxxxxxxxxxxxxxx"
                    + "&client_secret=xxxxxxxxxxxxxxxxxx"
                    + "&redirect_uri=http://localhost:8080/Abc/Oauth2callback"
                    + "&grant_type=authorization_code";

            //post parameters
            URL url = new URL("https://accounts.google.com/o/oauth2/token");
            URLConnection urlConn = url.openConnection();
            urlConn.setDoOutput(true);
            OutputStreamWriter writer = new OutputStreamWriter(
                    urlConn.getOutputStream());
            writer.write(urlParameters);
            writer.flush();

            //get output in outputString 
            String line, outputString = "";
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    urlConn.getInputStream()));
            while ((line = reader.readLine()) != null) {
                outputString += line;
            }
            System.out.println(outputString);

            //get Access Token 
            JsonObject json = (JsonObject)new JsonParser().parse(outputString);
            String access_token = json.get("access_token").getAsString();
            System.out.println(access_token);

            //get User Info 
            url = new URL(
                    "https://www.googleapis.com/oauth2/v1/userinfo?access_token="
                            + access_token);
            urlConn = url.openConnection();
            outputString = "";
            reader = new BufferedReader(new InputStreamReader(
                    urlConn.getInputStream()));
            while ((line = reader.readLine()) != null) {
                outputString += line;
            }
            System.out.println(outputString);

            // Convert JSON response into Pojo class
            GooglePojo data = new Gson().fromJson(outputString, GooglePojo.class);
            System.out.println(data);
            writer.close();
            reader.close();

        } catch (MalformedURLException e) {
            System.out.println( e);
        } catch (ProtocolException e) {
            System.out.println( e);
        } catch (IOException e) {
            System.out.println( e);
        }
        System.out.println("leaving doGet");
    }

}

在上面的代码中,google pojo只是一个pojo类,但我不知道我什么时候运行那个servlet,它给了我访问和refrshtoken .. 但是,它给了我错误

java.io.IOException:服务器返回HTTP响应代码:403为URL:https://www.googleapis.com/oauth2/v1/userinfo?access_token=xxxxxxxxxxxxx

2 个答案:

答案 0 :(得分:1)

您正在使用范围https://www.googleapis.com/auth/drive发出初始授权请求,并使用其代码调用https://www.googleapis.com/oauth2/v1/userinfo

如果您想获取用户个人资料信息,则必须在初始请求中使用其中一个范围,

  1. https://www.googleapis.com/auth/userinfo.email:查看电子邮件地址
  2. https://www.googleapis.com/auth/userinfo.profile:查看基本个人资料信息
  3. 因此,请将您的第一个网址更改为

    var url = "https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.profile&redirect_uri=http://localhost:8080/Abc/Oauth2callback&response_type=code&client_id=xxxxxxxxxxxxxxxxxxxxxxxxxx&access_type=offline&approval_prompt=force";
    

答案 1 :(得分:0)

您需要URLEncode请求参数。如果没有编码,则网址无效。