Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 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 для аутентификации.