Intereting Posts
Ошибка раздувания класса android.support.v7.widget.Toolbar. Моя ошибка или ошибка? NullPointerException: попытка вызвать виртуальный метод 'int java.util.ArrayList.size ()' для ссылки на нулевой объект Как получить строку из выбранного элемента SimpleCursorAdapter? Эмулятор Android не запускается, avd Google Chrome на Android (и только Android) Не позволяет Decimal с номером типа и step = "any" Аутентификация с помощью Active Directory через Kerberos Как получить значок, связанный с определенной учетной записью, из AccountManager.getAccounts () Эннументы и андроидная аннотация intDef Создайте курсор из жестко заданного массива вместо DB Запустить приложение facebook из другого приложения Ошибка при запуске первого тестового приложения: проблема упаковки Android? Легкий способ скрыть системную панель на Android ICS Как записывать файлы в папку с ресурсами или необработанную папку в Android? Android. Отображать контакты в виде списка Лучший способ сделать игровой цикл для Android с помощью OpengGLSurface

Учетные данные Webservice – OpenID / Android AccountManager?

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

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

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

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

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

Solutions Collecting From Web of "Учетные данные Webservice – OpenID / Android AccountManager?"

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

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

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

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

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

yourappname://usrname#XXXYYYZZZ 

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

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

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

Обновить:

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

Я потратил около недели, чтобы найти подходящий и современный способ для этого – без веб-браузера и с помощью менеджера аккаунта 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); } 

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

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

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

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

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