Как аутентифицировать мобильное приложение без имени пользователя и пароля? - PullRequest
4 голосов
/ 08 сентября 2010

Я создаю веб-приложение, которое использует OpenId для аутентификации пользователей, как это делает Stackoverlfow. Также будет мобильное приложение, например Android или iPhone. Эти приложения должны как-то проходить аутентификацию или вход в систему, чтобы получить доступ к данным и обновлениям, которые принадлежат пользователю. Поскольку нет имени пользователя и пароля, которые можно было бы предоставить для аутентификации мобильного устройства, мне интересно, как этого добиться.

Два способа пришли мне в голову:

  1. Сгенерируйте некоторый ключ на сервере, который необходимо ввести на устройстве. Этот ключ будет отправлен как ключ авторизации, когда мобильное устройство отправляет или запрашивает данные, и пользователь может быть связан таким образом. При использовании этой опции ключ должен быть каким-либо образом доставлен пользователю, чтобы ему не приходилось вводить его. Возможно по электронной почте, SMS или путем сканирования штрих-кода.

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

Мой вопрос: возможны ли оба способа и сэкономить? Какой из них вы бы предпочли? На какие детали стоит обратить внимание? Есть ли другие способы сделать это? Если бы я все понял правильно, было бы невозможно использовать OpenId на устройстве и таким образом связать мобильное устройство и веб-приложение, верно?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010

Для этого я сделал следующее:

  • При первом запуске приложения я проверяю, есть токен аутентификации и если он все еще действителен
  • Если нет, я использую [startActivityForResult] [1], чтобы открыть свою регистрационную активность
  • LoginActivity использует WebView и открывает страницу «Проверка подлинности приложения» (например, https://www.yourdomain.com/authapp) из веб-приложения.
  • Если пользователь не вошел в веб-приложение, он должен сделать это сейчас. При успешном входе в систему он перенаправляется на страницу «Проверка подлинности приложения»
  • На странице «Аутентификация приложения» содержится текст «Хотите, чтобы мобильное приложение получило доступ к вашим данным», а также кнопки «Предоставить» и «Отмена».
  • Если пользователь нажимает «предоставить», веб-приложение генерирует токен аутентификации, записывает его в базу данных и перенаправляет на страницу ответа, присоединяя сгенерированный токен аутентификации к URL-адресу (например, https://www.yourdomain.com/authresponse?auth_token=dshf84z4388f4h)
  • Мобильное приложение извлекает токен из URL и использует его для аутентификации при разговоре с сервером.

    Активность WebLogin выглядит следующим образом: (примечание: вам нужно переопределить «shouldOverrideUrlLoading», чтобы остаться в том же WebView. В противном случае новый браузер открывается при получении некоторого перенаправления)

    открытый класс WebLogin расширяет действие {

    @ Override protected void onCreate (BundlevedInstanceState) { super.onCreate (savedInstanceState); * 1 028 *

    WebView webview = new WebView(this);
    webview.setWebViewClient(new WebViewClient() {  
    
        @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            view.loadUrl(url);
            return true;  
        }  
    
        @Override
        public void onPageFinished(WebView view, String url) {
    
            if(StringUtils.contains(url, "?auth_token=")){
    
                // extract and save token here
    
                setResult(RESULT_OK);
                finish();
            }
        }
    });
    
    webview.loadUrl("https://www.yourdomain.com/authapp");
    webview.getSettings().setJavaScriptEnabled(true);
    setContentView(webview);
    

    } }

Обратите внимание, я использую https для сохранения. Если вы используете простой http, можно прочитать и украсть маркер пользователя.

[1]: http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)

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

Я делаю что-то похожее на вариант (1). Создайте уникальную ссылку (даже просто включите идентификатор сессии), а затем отправьте ее с помощью SMS. Есть много дешевых поставщиков смс с простыми API для этого. Когда пользователь нажимает на URL в SMS, он открывает мобильный веб-браузер и регистрирует их.

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

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

Текущая спецификация OAuth (RFC5849) по-прежнему требует, чтобы пользователь вводил свои учетные данные на веб-сайте, который содержит защищенный ресурс. В мобильном приложении этот пользовательский интерфейс не самый лучший (как вы указали, мобильное приложение должно отображать страницу авторизации с интегрированным веб-представлением). OAuth 2.0 решает эту проблему, указывая различные типы прав доступа. Этот стандарт все еще находится в разработке. До тех пор лучшим вариантом, вероятно, будет изменение потоков OAuth 1.0 для соответствия мобильному устройству, как это уже делают многие крупные сайты (например, Twitter с xAuth и Dropbox с их API разработчика ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...