Как сделать AccountManager (authtoken) и OpenID работать вместе (без AppEngine)?

Я делаю приложение для Android, которое должно иметь возможность получать данные из веб-службы (которая не является частью GAE). Пользователи могут войти в веб-службу через свой браузер с помощью OpenId (разрешены только учетные записи Google).

AccountManager может дать мне authtoken. Я мог бы сохранить этот authtoken на своем сервере вместе с именем пользователя google пользователя (email), а затем использовать это имя учетной записи, чтобы подключить его регистрацию openid с регистрацией приложения.

Но это ничего не решает, потому что у меня нет возможности проверить этот токен на пользовательской информации OpenID... Или я? Я думал, что могу использовать user authtoken для "как-то" связать свою учетную запись Android с учетной записью в Интернете.

Это все больше похоже на неправильный способ справиться с этим, но я не хочу сохранять пользователей Google имя пользователя и пароль в SharedPreferences и использовать эти данные для входа.

Любые творческие идеи? Благодаря

Ответы

Ответ 1

Я решил эту точную проблему для своего приложения Push Actions - http://www.pushactions.com. Для моего решения я в конечном итоге использовал GAE, но только для аутентификации токена. Фактическое приложение Push Actions размещено на Heroku. Здесь мой поток:

  • Android-приложение генерирует токен GAE, затем отправляет токен и электронную почту учетной записи адрес для нажатия на действия, выполняемые на Heroku
  • Push Actions отправляет токен моей службе, запущенной на GAE
  • Служба GAE принимает маркер, определяет, действительно ли он, и возвращает адрес электронной почты, который действителен для
  • Push Actions сравнивает адрес электронной почты, возвращаемый GAE, с адресом электронной почты из приложения Android, если они совпадают, токен действителен для этого адреса электронной почты. Это означает, что маркер может быть безопасно связан с адресом электронной почты google пользователя.

Насколько я знаю, это единственный способ проверить, действительно ли токен, сгенерированный AccountManager. Правда, это требует использования GAE, но только для одной маленькой части вашего общего приложения. Моя служба GAE оказалась похожей на 1 класс и несколько строк кода, поэтому это немного. Вы можете думать о части GAE как услуге, предоставляемой google для аутентификации токенов.

Вот код для моего сервиса GAE:

package com.pushactions;

import java.io.IOException;
import java.util.logging.Logger;

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

import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

@SuppressWarnings("serial")
public class PushActionsAuthServlet extends HttpServlet {
    private static final Logger log = Logger.getLogger(HttpServlet.class.getName());

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
        if (user != null) {
            req.setAttribute("user", user);
            try {
                req.getRequestDispatcher("/logged_in.jsp").forward(req, resp);
            } catch (ServletException e) {
                log.severe("Couldn't redirect to logged_in.jsp");
            }
        } else {
            try {
                req.getRequestDispatcher("/logged_out.jsp").forward(req, resp);
            } catch (ServletException e) {
                log.severe("Couldn't redirect to logged_out.jsp");
            }
        }
    }
}

logged_in.jsp:

<%@ page import="com.google.appengine.api.users.User" %>
<% User user = (User)request.getAttribute("user"); %>
<?xml version="1.0" encoding="UTF-8"?>
<result>
<status>ok</status>
<user_name><%= user.getEmail() %></user_name>
</result>

logged_out.jsp:

<%@ page import="com.google.appengine.api.users.User" %>
<% User user = (User)request.getAttribute("user"); %>
<?xml version="1.0" encoding="UTF-8"?>
<result>
<status>error</status>
<message>not logged in</message>
</result>