Учетные данные 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 внизу этой страницы вы найдете весь необходимый код

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