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

#android #openid #webserver #accountmanager #auth-token

#Android #OpenID #веб-сервер #accountmanager #auth-токен

Вопрос:

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

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

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

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

Есть творческие идеи? Спасибо

Комментарии:

1. ни у кого нет идеи? Я прочитал много вопросов по некоторым смежным темам, но не нашел решения.

2. У нас точно такой же вопрос. Из того, что мы пробовали, кажется, что authToken, который мы можем получить от AccountManager, может использоваться только для получения разрешений для определенного Google API с использованием OAuth — не для аутентификации пользователя с OpenID

3. я также хотел бы знать, мне нужно сделать то же самое

Ответ №1:

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

  1. Приложение Android генерирует токен GAE, затем отправляет токен и адрес электронной почты учетной записи, чтобы запускать действия, выполняемые на Heroku
  2. Push Actions отправляет токен в мою службу, работающую на GAE
  3. Служба GAE принимает токен, определяет, действителен ли он, и возвращает адрес электронной почты, для которого он действителен
  4. Push Actions сравнивает адрес электронной почты, возвращенный GAE, с адресом электронной почты из приложения Android, если они совпадают, токен действителен для этого адреса электронной почты. Это означает, что токен может быть безопасно связан с адресом электронной почты OpenID пользователя Google.

Насколько я знаю, это ЕДИНСТВЕННЫЙ способ проверить, действителен ли токен, сгенерированный AccountManager. Правда, это требует использования GAE, но только для одной небольшой части вашего общего приложения. Мой сервис GAE в итоге представлял собой что-то вроде 1 класса и нескольких строк кода, так что это не так уж много. Вы можете думать о GAE piece как о сервисе, предоставляемом 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>
  

Комментарии:

1. Говорю вам, ребята, это и есть ответ 🙂 Представьте, если бы Google предоставил сервис, который аутентифицировал токены. Все, что вам нужно было сделать, это отправить токен, сгенерированный Android, в службу, и Google ответит, был ли токен действительным. Это звучит подходяще? Ну, это именно то, что дает мой ответ.

2. потрясающе, похоже, это именно то, что мне нужно. не могли бы вы рассказать мне, как вы передаете токен и электронное письмо в GAE (вашему PushActionsAuthServlet). я не могу судить по вашему коду. большое спасибо!

3. Эй, dweebo, я просто выполняю http get для » MYAPP.appspot.com/_ah/login?auth=GAE_TOKENamp;continue=https : // … » http post также может работать, не тестировал

4. Я сделал то же самое, что и вы. Я создал приложение python GAE для получения информации об аутентификации и возврата электронной почты пользователя. Одна вещь, которую необходимо проверить, это то, что некоторые пользователи используют символы верхнего регистра в своих адресах электронной почты, поэтому не забывайте сравнивать электронные письма только после использования некоторой функции, чтобы сделать все символы строчными.