Протокол використовують Twitter, Google, Flickr, Digg, Yahoo і багато інших сервісів.
Аутентифікація - ви відвідуєте режимне підприємство і показуєте своє посвідчення. Охоронець дивиться і приймає рішення: посвідчення справжнє? друк на місці? фотка збігається? Досвідчений охоронець може дізнатися вас в обличчя і пропустити і так. Аутентифікація може бути простою, а може бути і складною.
На сайтах зазвичай аутентифікація відбувається за схемою логін / пароль, змушуючи користувача вводити дані і перевіряючи їх на сервері.
Використання OAuth2 підходить для:
- Отримання дозволу від користувача для доступу до онлайн-службі за допомогою свого облікового запису.
- Аутентифікація на онлайн-сервісі від імені користувача.
- Обробка помилок аутентифікації.
Щоб почати використовувати OAuth2, ви повинні знати:
Запит Auth Token
Маючи необхідні повноваження, ви можете викликати AccountManager.getAuthToken () для отримання токена. Більшість методів AccountManager - асинхронні. Вам доведеться реалізувати її у вигляді серії зворотних викликів, наприклад:
У цьому прикладі клас OnTokenAcquired розширює AccountManagerCallback. AccountManager викликає run () в OnTokenAcquired з AccountManagerFuture. що містить Bundle. Якщо виклик успішний, то токен буде всередині Bundle.
Ви можете отримати токен з Bundle:
Якщо все піде добре, то Bundle буде містити допустимий токен в ключі KEY_AUTHTOKEN. Але не завжди все йде так як заплановано.
Обробляє кожна програма перші два випадки, показуючи повідомлення про помилку користувачеві. Якщо мережа не працює або користувач вирішив не надавати доступ, то ваш додаток нічого не може з цим вдіяти. Останні два випадки трохи складніше, тому що добре оптимізовані додатки повинні обробляти ці невдачі автоматично.
Третій випадок невдачі, має недостатні повноваження, передається через Bundle. який ви отримуєте в вашому AccountManagerCallback (OnTokenAcquired з попереднього прикладу). Якщо Bundle включає Intent в ключі KEY_INTENT. то аутентифікатор говорить вам, що йому необхідно пряму взаємодію з користувачем, перш ніж він може дати вам дійсний токен.
Зверніть увагу, що приклад використовує startActivityForResult (). і ви можете перехопити результат Intent в методі onActivityResult () у вашій активності. Якщо ви не станете перехоплювати результат відповіді Intent аутентифікатора, неможливо буде визначити пройшов користувач перевірку справжності чи ні. Якщо результат RESULT_OK. то аутентифікатор оновив збережені повноваження, щоб вони були достатні для доступу який ви запросили, далі ви повинні викликати AccountManager.getAuthToken () знову і запросити новий токен аутентифікації.
Останній випадок, коли токен закінчився, насправді не помилка AccountManager. Єдиний спосіб з'ясувати чи дійсно токен закінчився - це зв'язатися з сервером, що було б марнотратним і дорогим з боку AccountManager постійно виходити в інтернет і перевіряти стан всіх своїх токенов. Так що ця невдача може бути виявлено тільки коли програма намагається використовувати токен аутентифікації для доступу до веб сервісу.
Підключення до онлайн-сервісів
Приклад нижче показує, як підключитися до сервера Google. Так як Google використовує стандарт протоколу OAuth2 для перевірки справжності запитів, методи, обговорювані тут широко застосовуються. Майте на увазі, що кожен сервер відрізняється. Вам може знадобитися внести невеликі зміни в цей приклад для обліку вашої конкретної ситуації.
Google API вимагає надання чотирьох значень з кожним запитом: API key, client ID, client secret, і auth key. Перші три виходять на сайті Google API Console. Останнє значення ви отримуєте викликавши AccountManager.getAuthToken (). Ви передаєте їх на сервер Google в якості частини HTTP-запиту.
Якщо запит повертає HTTP-помилку 401, то ваш токен був відхилений. Найпоширеніша причина цього - витікання токена. Виправити це просто: викличте AccountManager.invalidateAuthToken () і повторіть запит токена ще раз.
Так як закінчення токена є звичайним явищем і виправлення цієї ситуації досить легке, багато програм просто припускають закінчення токена ще до того як стане відомо про це. Якщо оновлення токена дешева операція для вашого сервера, ви можете викликати AccountManager.invalidateAuthToken () перед першим викликом AccountManager.getAuthToken () і позбавити себе від необхідності запитувати токен аутентифікації два рази.
В майбутньому ми розглянемо практичні приклади для OAuth.