Как получить токен доступа в Google AppEngine (OAuth 2.0) с помощью java

Я получаю исключение для доступа к токену Socket java.lang.RuntimeException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException:

Есть ли решение разместить запрос (код) на обмен токена

Вот мой код для получения кода для доступа к токену, который я использую Httpclient, это любое решение

в index.jsp

 response.sendRedirect("https://accounts.google.com/o/oauth2/auth?  scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email&state=%2Fprofile&response_type=code&client_id=158645513564-88hf7od82d09ipr7uiamd540jpd2da1g.apps.googleusercontent.com&redirect_uri=http://gfksgnbgfcv.appspot.com/index2.jsp");

в index2.jsp

<%@page import="com.login.client.TEST"%>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page errorPage="errorPage.jsp" %>
<%
   String code  =  request.getParameter("code");
   String data=TEST.getParseValue(code);
 %>
 <%=code%>
 <%=data %>

И Java-код

   package com.login.client;


  import java.io.IOException;
  import java.io.UnsupportedEncodingException;

  import java.util.ArrayList;
  import java.util.List;

  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;

  import net.sf.json.JSONObject;
  import net.sf.json.JSONSerializer;
  import net.sourceforge.htmlunit.corejs.javascript.json.JsonParser.ParseException;

  import org.apache.commons.httpclient.HttpClient;
  import org.apache.commons.httpclient.HttpException;
  import org.apache.commons.httpclient.HttpStatus;
  import org.apache.commons.httpclient.methods.GetMethod;
  import org.apache.commons.httpclient.methods.PostMethod;
  import org.apache.commons.httpclient.methods.StringRequestEntity;
  import org.apache.commons.io.IOUtils;


   public class TEST  {

 public static String   getParseValue(String code) {
        String token="no token";
        String foros = "code="+code +
                    "&client_id=<YOUR_CLIENT_ID>" +
                    "&client_secret=<YOUR_CLIENT_SECRET>" +
                    "&redirect_uri="+"http://gfksgnbgfcv.appspot.com/index2.jsp" +
                    "&grant_type=authorization_code";
     HttpClient client = new HttpClient();
        String url = "https://accounts.google.com/o/oauth2/token";
        PostMethod post = new PostMethod(url);
        post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        try {
            post.setRequestEntity(new StringRequestEntity(foros, null, null));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        String accessToken = null;
        try {
            client.executeMethod(post);

            String jsonTxt = IOUtils.toString(post
                    .getResponseBodyAsStream());

            JSONObject json = (JSONObject) JSONSerializer
                    .toJSON(jsonTxt);
            String resp = post.getResponseBodyAsString();

            token = (String) json.getString("access_token");
        } catch (HttpException e) {
            token=e.getMessage();
            throw new RuntimeException(e);
        } catch (IOException e) {
            token=e.getMessage();
            throw new RuntimeException(e);
        } catch (Exception e) {
            token=e.getMessage();
            throw new RuntimeException(e);
        }
     return token;

      }

}


person Ashraf    schedule 04.06.2013    source источник


Ответы (1)


Apache HttpClient не поддерживается в GAE (по крайней мере, без настройки). Вам следует использовать URLFetch API.

person Peter Knego    schedule 04.06.2013
comment
Привет, я использую URLFetch API, я получаю {error:invalid_request}, мой код Java находится здесь pastebin.com/2TferLyB что не так с этим кодом? - person Ashraf; 06.06.2013
comment
Вы не должны устанавливать Content-length, это делается GAE автоматически. - person Peter Knego; 07.06.2013
comment
Также это POST - вы должны создать тело x-www-form-urlencoded, а не добавлять параметры в заголовок. - person Peter Knego; 07.06.2013
comment
Он работает нормально... но часто возникает ошибка тайм-аута {Тайм-аут при получении URL: accounts.google. com/o/oauth2/token}.... есть предложения? - person Ashraf; 07.06.2013
comment
setDeadline(..): developers.google.com/appengine/docs/java/javadoc/com/google/ - person Peter Knego; 07.06.2013
comment
Я использую API подготовки с помощью com.google.gdata.data.appsforyourdomain jar, теперь я устанавливаю токен для учетных данных и использую этот токен, получая некоторую ошибку. Вот мой код для извлечения всех пользователей, что здесь не так pastebin.com/z4gYub9G - person Ashraf; 10.06.2013