Как да извлека токен за достъп в 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