如何使用Oauth 2从Gmail帐户导入Gmail联系人

时间:2015-05-20 06:50:19

标签: java jsp google-contacts google-oauth2

我正在尝试将gmail联系人导入我的java Web应用程序。我按照文档https://developers.google.com/identity/protocols/OAuth2WebServer?csw=1#callinganapi

我能够对gmail用户进行身份验证,但是当我点击“接受”时,当我被要求管理您的联系人时,我会收到错误:

java.net.ConnectException:连接超时

我打电话给这个网址:

https://accounts.google.com/o/oauth2/auth?client_id=XXXXXXX&redirect_uri=http://XXXX/call.jsp&scope=https://www.google.com/m8/feeds/&response_type=code

当我登陆我的网络应用程序的call.jsp时,它显示错误在线:

client.executeMethod(post);

这是我在call.jsp上的代码:

<%@page import="org.jsoup.select.Elements"%>
<%@page import="org.jsoup.Jsoup"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.jsoup.nodes.Document"%>
<%@page import="org.apache.commons.httpclient.methods.GetMethod"%>
<%@page import="org.json.JSONObject"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="org.apache.commons.httpclient.NameValuePair"%>
<%@page import="org.apache.commons.httpclient.methods.PostMethod"%>
<%@page import="org.apache.commons.httpclient.HttpClient"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>
    <%

         String code = request.getParameter("code");
      System.out.println(code);
      HttpClient client = new HttpClient();
      PostMethod post = new PostMethod("https://accounts.google.com/o/oauth2/token");
      post.addRequestHeader("Host", "accounts.google.com");
      post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      NameValuePair[] data = {
                new NameValuePair("code", code),
                new NameValuePair("client_id", "XXXXX"),
                new NameValuePair("client_secret", "XXXXX"),
                new NameValuePair("redirect_uri", "http://XXX/call.jsp"),
                new NameValuePair("grant_type", "authorization_code")
      };
      post.setRequestBody(data);
            client.executeMethod(post);
            BufferedReader b = new BufferedReader(new InputStreamReader(post.getResponseBodyAsStream()));
             StringBuilder sb = new StringBuilder();
            String str = null;
            while ((str = b.readLine()) != null) {
                sb.append(str);
            }
            JSONObject access_token = new JSONObject(sb.toString());
            GetMethod get = new GetMethod("https://www.google.com/m8/feeds/contacts/default/full?max-results=1000&access_token=" + access_token.getString("access_token"));
                client.executeMethod(get);
                b = new BufferedReader(new InputStreamReader(get.getResponseBodyAsStream()));
                sb = new StringBuilder();
                str = null;
                while ((str = b.readLine()) != null) {
                    sb.append(str);
                }
                Document doc = null;
             //Here you will get contacts in xml format.  
             out.print(sb.toString());
             // Using Jsoup you can read data from xml



    %>
</body>
</html>

请建议,我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以获得authorization code,但没有令牌。

您的post对象正在使用网址值https://accounts.google.com/o/oauth2/token,但根据您已关联的文档,要获取token,您必须使用https://googleapis.com/oauth2/v3/token < / p>

使用库

为什么不使用像gdata-java-client CloudSponge这样的库,而不是尝试重新发明轮子?

它们为您封装了所有细节,并有几个样本。

答案 1 :(得分:0)

首先,在JSP页面中内联Java代码并不是一个好主意。请参阅this question的答案以了解原因。

据我所知,您使用相同的JSP来发出OAuth请求并将回调作为重定向URI处理。我猜你试图关注this tutorial。如您所见,该教程使用Struts框架将视图逻辑(显示联系人列表)中的控制器逻辑(使用Struts Action创建OAuth请求)分开。

尝试完整地遵循本教程,然后根据您的需要进行自定义和调整。