Вопросы о использовании вашего собственного API с OAuth - PullRequest
28 голосов
/ 16 декабря 2011

Я создаю RESTful API для проекта, над которым я работаю, и я бы хотел, чтобы основное приложение использовало API, потому что:

  1. Это приведет к наличию одного наборакод для поддержки
  2. Если мы решим открыть API для сторонних разработчиков, это уже будет сделано
  3. Это открывает возможность для создания мобильных приложений, которые его потребляют
  4. Iочень хочу узнать, как это сделать

API будет размещаться на поддомене https://api.example.com, а основное веб-приложение будет размещаться в корневом домене https://example.com.

Концептуально я понимаю, как все работает, но мой главный вопрос - как изменится поток аутентификации, если вообще будет.Обычно сторонние приложения:

  1. Получают токен запроса от https://api.example.com/request_token
  2. Перенаправляют пользователя для аутентификации на https://api.authenticate.com/authorize
  3. Перенаправляют обратно на 3-йстороннее приложение
  4. Получить токен доступа от https://api.example.com/access_token

Поскольку я контролирую оба домена, могу ли я сделать что-то похожее на:

  1. Получить запростокен, когда пользователь попадает на экран входа в систему на https://www.example.com
  2. . Пользователь аутентифицируется с помощью формы на https://www.example.com, которая вызывает тот же код, что и https://api.example.com/authorize
  3. Если учетные данные действительны,токен запроса заменяется на токен доступа
  4. токен доступа сохраняется в сеансе и истекает, когда пользователь выходит из системы, как обычно:

Шаг 3 кажется, что это неправильно, так какбудет дублирующим кодом, но разве это не откроет меня для атак XSS? Форма входа на https://www.example.com отправила данные на https://api.example.com, поскольку они технически разных доменов?

Я это слишком усложняю?

Ответы [ 2 ]

20 голосов
/ 16 декабря 2011

Я столкнулся с той же проблемой и решил ее следующим образом.

1 Для сторонних приложений, использующих мой API, они должны проходить аутентификацию через OAuth для всех запросов.

2 Для моих собственных сторонних клиентов (мобильные, AIR и т. Д.) - они используют OAuth, с той разницей, что я разрешаю им отправлять имя пользователя и пароль непосредственно на этапе авторизации (поэтому я могу создать собственный диалог входа в систему). Это при условии, что ваш API работает через SSL / HTTPS.

3 Для своего веб-приложения я использую аутентификацию cookie для доступа к API. Т.е. после входа в систему пользователь может просто вызвать API: urls и получить обратно JSON / XML. Отлично подходит для быстрого изучения API-интерфейсов (хотя настоящая API-консоль, такая как APIGee, там работает лучше).

0 голосов
/ 16 декабря 2011

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

...