Учетные данные Webservice - OpenID/Android AccountManager?
Я создаю веб-сервис и хочу использовать учетные данные учетной записи пользователя google.
Служба работает на GAE и будет иметь веб-клиент и собственный клиент Android.
Это моя первая попытка что-то вроде этого, и я читал об OpenID и библиотеке AccountManager Android.
Я все еще не уверен, какие у меня варианты с точки зрения хранения пользователей в моем хранилище данных. Какой идентификатор я должен использовать? Можно ли использовать OpenID в родном приложении для Android?
Любая помощь и/или указатели будут оценены. Спасибо.
Ответы
Ответ 1
У нас были аналогичные требования к последнему проекту: бэкэнд 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://
, так что, когда пользователь cliskc этой ссылки, наше приложение вызывается, и ссылка передается ему. Мы извлекаем имя пользователя и токен из этой ссылки, и мы используем его в запросах REST для бэкэнда GAE.
Если у вас есть еще вопросы, я бы с радостью обновил этот пост.
Update:
Пользовательский cookie сеанса при производстве AppEngine имеет имя ACSID
, а на сервере разработки AppEngine он называется dev_appserver_login
.
Ответ 2
Я потратил около недели, чтобы найти подходящий и современный способ для этого - без веб-браузера и с помощью менеджера аккаунта Android.
Если вы хотите использовать учетную запись Google и AccountManager для идентификации пользователя, вы можете:
-
Получите свой токен в Контакты 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;
}
-
Передача полученного UserToken на сервер через защищенный канал.
-
Подтвердите маркер на сервере 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;
}
-
Срок действия токена Google может истекать (обычно через час), поэтому, если вам не удалось проверить маркер на сервере, вы должны отправить ответ обратно клиенту, аннулировать токен и получить новый. Использовать диспетчер аккаунтов для недействительности токена:
public void invalidateUserToken(Context context, String token)
{
AccountManager accountManager = AccountManager.get(context);
accountManager.invalidateAuthToken("com.google", token);
}
Ответ 3
Я думаю, этот сообщение в блоге делает именно то, что вы хотите. Это сработало для меня. Оба решения, размещенные здесь, являются жизнеспособными и умными, но я думаю, что это делает именно то, о чем спрашивал ассер.
По сути, вы просто получаете authToken, используя область "ah", и передаете ее на нужную веб-страницу, чтобы получить файл cookie ACSID, который позволит вам получить доступ к любой странице AppEngine, использующей UserService для аутентификации.
Ответ 4
http://developer.android.com/search.html#q=AccountManager&t=0
http://developer.android.com/resources/samples/SampleSyncAdapter/index.html в нижней части этой страницы вы найдете весь необходимый код
С наилучшими пожеланиями