суббота, 22 февраля 2014 г.

OAuth

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

При написании этой статьи предполагается, что вы уже имеете представление о токам устроено расширение браузера и как работает OAuth. Начать знакомство с этой темой можно со статьи в википедии.

Быстрый старт

Для начала вам понадобится:

Протокол OAuth включает в себя три шага:

  • получение первоначального токена запроса
  • авторизация пользователя и подтверждение им права доступа к запрошенным данным
  • получение токена доступа

С расширением все немного сложнее. Тут нет URLа на который можно перенаправить пользователя после завершения авторизации и подтверждения доступа. Так что гугл, совместно с некоторыми другими компаниями немного доработал OAuth для использования с приложениями. Вместо URL ресурса используется имя приложения. Конечный результат тот же самый: фоновая страница запрашивает токен, открывает отдельную вкладку для авторизации и подтверждения доступа, и, наконец, выполняет асинхронный запрос для получения токена доступа.

var oauth = ChromeExOAuth.initBackgroundPage({
'request_url': 'https://www.google.com/accounts/OAuthGetRequestToken',
'authorize_url': 'https://www.google.com/accounts/OAuthAuthorizeToken',
'access_url': 'https://www.google.com/accounts/OAuthGetAccessToken',
'consumer_key': 'anonymous',
'consumer_secret': 'anonymous',
'scope': 'https://docs.google.com/feeds/',
'app_name': 'My Extension name'
});

Вот примерно так выглядит инициализация библиотеки. Для работы с другими OAuth-сервисами, не гуглом, нужно смотреть их документацию для разработчиков. URL будут другие, общий принцип такой же.


В манифесте должны быть соответтсвующие разрешения:

"permissions": [ "tabs", "https://docs.google.com/feeds/*",
"https://www.google.com/accounts/OAuthGetRequestToken",
"https://www.google.com/accounts/OAuthAuthorizeToken",
"https://www.google.com/accounts/OAuthGetAccessToken"
]

Начинаем процесс:

oauth.authorize(function() {
// ... Ready to fetch private data ...
});

Будет открыта новая вкладка, пользователь там авторизуется, и разрешит доступ. Когда этот процесс завершится будет вызвана callback функция. Нам нет необходимости заботится о хранении токена и прочих нюансах – все это спрятано в библиотеке. Она хранит токен в localStorage и если мы повторно запросим авторизацию, но новая вкладка не откроется, а будет использован уже имеющийся токен. Callback функция будет вызвана в любом случае.



Возникают вопросы:



  1. приложение может запрашивать разный объем прав доступа. Где и как это задается?

  2. Как распознается ситуация, когда пользователь отказался предоставить доступ, или не смог авторизоваться (забыл пароль например)?

  3. Что будет если сервис авторизации в данный момент недоступен?

После получения доступа мы получаем возможность отправлять подписанные запросы:

function callback(resp, xhr) {
// ... Process text response ...
};

function onAuthorized() {
var url = 'https://docs.google.com/feeds/default/private/full';
var request = {
'method': 'GET',
'parameters': {'alt': 'json'}
};

// Send: GET https://docs.google.com/feeds/default/private/full?alt=json
oauth.sendSignedRequest(url, callback, request);
};

oauth.authorize(onAuthorized);

Более сложный пример:

function onAuthorized() {
var url = 'https://docs.google.com/feeds/default/private/full';
var request = {
'method': 'POST',
'headers': {
'GData-Version': '3.0',
'Content-Type': 'application/atom+xml'
},
'parameters': {
'alt': 'json'
},
'body': 'Data to send'
};

// Send: POST https://docs.google.com/feeds/default/private/full?alt=json
oauth.sendSignedRequest(url, callback, request);
};
Существуют еще различные вариации и скользкие моменты, для их прояснения придется хорошо порыться в примерах, документации и исходниках чужих расширений

1 комментарий:

  1. If you're looking to lose kilograms then you need to get on this totally brand new personalized keto meal plan diet.

    To design this keto diet service, certified nutritionists, personal trainers, and professional cooks joined together to develop keto meal plans that are effective, convenient, price-efficient, and satisfying.

    Since their first launch in January 2019, 1000's of individuals have already remodeled their body and well-being with the benefits a professional keto meal plan diet can offer.

    Speaking of benefits: in this link, you'll discover 8 scientifically-certified ones given by the keto meal plan diet.

    ОтветитьУдалить