Учетные данные веб-службы - OpenID / Android AccountManager? - PullRequest
30 голосов
/ 28 июля 2010

Я создаю веб-сервис и хотел бы использовать учетные данные пользователя Google.

Служба работает на GAE и будет иметь веб-клиент и собственный клиент Android.

Это моя первая попытка чего-то подобного, и я читал об OpenID и библиотеке Android AccountManager.

Я все еще не уверен, какие у меня есть варианты с точки зрения хранения пользователей в моем хранилище данных. Какой идентификатор мне следует использовать? Можно ли использовать OpenID в нативном приложении Android?

Любая помощь и / или указатели будут оценены. Спасибо.

Ответы [ 4 ]

30 голосов
/ 17 февраля 2011

У нас были похожие требования к последнему проекту: бэкэнд GAE с клиентским интерфейсом GWT и Android / iPhone. Кроме того, мы не хотели хранить учетные данные пользователя.

Поэтому мы решили использовать OpenID, который, к сожалению, является веб-стандартом и плохо работает с мобильными устройствами, но выполним.

На стороне GAE мы просто включили федеративный вход в систему, который дал нам OpenID.

На мобильных устройствах, когда пользователю необходимо войти в систему, мы представляем им список аутентификаторов OpenID (Google, Yahoo и т. Д.). Затем мы открываем собственный браузер (не встроенный браузер) и направляем пользователя на выбранный сайт аутентификации OpenID. Положительным моментом является то, что в браузере пользователя обычно уже запоминается имя пользователя / пароль, поэтому для этого шага пользователю достаточно нажать одну кнопку.

Это все довольно просто. Теперь вот сложная часть: После того, как пользователь подтверждает вход в систему, OpenID перенаправляет обратно на наш URL-адрес возврата GAE (вам необходимо указать этот URL-адрес при выполнении запроса). По этому URL мы создаем пользовательский URL, например:

yourappname://usrname#XXXYYYZZZ

где XXXYYYZZZZ - токен авторизации. Мы получаем этот токен со страницы возврата, где он хранится как файл cookie ACSID: мы использовали JSP-файл, чтобы прочитать этот файл cookie и обернуть его в указанный выше пользовательский URL.

Затем мы регистрируем наши приложения для Android и iPhone для обработки URL-адресов yourappname://, поэтому, когда пользователь нажимает эту ссылку, наше приложение вызывается и ссылка передается ему. Из этой ссылки мы извлекаем имя пользователя и токен и используем его в запросах REST к бэкэнду GAE.

Если у вас есть еще вопросы, я с удовольствием обновлю этот пост.

Обновление:

Файл cookie сеанса пользователя в производственном AppEngine называется ACSID, а на сервере разработки AppEngine - dev_appserver_login.

12 голосов
/ 13 июля 2011

Я потратил около недели, чтобы найти подходящий и современный способ для этого - без веб-браузера и с помощью менеджера аккаунтов Android.

Если вы хотите использовать аккаунт Google и AccountManager, чтобы идентифицировать пользователя, которого выможет:

  1. Получить свой токен для контактов Google (тип токена авторизации "cp") через AccountManager на фоне нить:

    public String getUserToken(Activity activity)
    {
        AccountManager accountManager = AccountManager.get(activity);
        AccountManagerFuture<Bundle> amf = accountManager.getAuthTokenByFeatures("com.google", "cp", null, activity, Bundle.EMPTY, Bundle.EMPTY, null, null );
    
        Bundle bundle = null;
        try {
            bundle = amf.getResult();
            String name = (String) bundle.get(AccountManager.KEY_ACCOUNT_NAME);
            String type = (String) bundle.get(AccountManager.KEY_ACCOUNT_TYPE);
            String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
            return token;
        } catch (OperationCanceledException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  2. Передать полученный UserToken на сервер по защищенному каналу.

  3. Проверка токена на сервере с помощью Google с помощью библиотеки gdata ( Библиотека API данных Google ):

    public String getUserId(String token)
    {
        ContactsService contactsService = new ContactsService("Taxi");
        contactsService.setUserToken(token);
    
        IFeed feed = null;
        try {
            feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000"), ContactFeed.class);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    
        if (feed == null)
            return null;
    
        String externalId = feed.getId();
        IPerson person = feed.getAuthors().get(0);
        String email = person.getEmail();
        String name = person.getName();
        String nameLang = person.getNameLang();
    
        return externalId;
    }
    
  4. Срок действия токена Google может истечь (обычно через час), поэтому, если вам не удалось проверить токен на сервере, вы должны отправить ответ клиенту, аннулировать токен и получить новый.Используйте менеджер аккаунта для аннулирования токена:

    public void invalidateUserToken(Context context, String token)
    {
        AccountManager accountManager = AccountManager.get(context);
        accountManager.invalidateAuthToken("com.google", token);
    }
    
3 голосов
/ 18 декабря 2012

Я думаю это сообщение в блоге делает именно то, что вы хотите.Это сработало для меня.Оба решения, представленные здесь, являются жизнеспособными и умными, но я думаю, что это делает именно то, о чем спрашивал аскер.

По сути, вы просто получаете authToken с использованием области «ах» и передаетеправильная веб-страница для получения файла cookie ACSID, который позволит вам получить доступ к любой странице AppEngine, которая использует UserService для аутентификации.

0 голосов
/ 02 сентября 2010

http://developer.android.com/search.html#q=AccountManager&t=0

http://developer.android.com/resources/samples/SampleSyncAdapter/index.html внизу этой страницы вы найдете весь необходимый код

С наилучшими пожеланиями

...