2011-12-15 2 views
28

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

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

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

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

  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. маркера
  5. доступа сохраняется в сессии, и истекает, когда пользователь выходит из системы, как это обычно бы

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

Могу ли я превзойти это?

ответ

20

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

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

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

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

+2

Не могли бы вы подробнее остановиться на пункте 3? Когда пользователь входит в систему, вы сохраняете идентификатор сеанса в файле cookie, а затем используете это как токен псевдодоступа при выполнении вызова API, а затем просматриваете его, когда получаете запрос API? Похоже, что это будет уязвимость безопасности ... – Steve

+1

По существу да. Но как эта уязвимость? Я не использую OAuth при вызове API из веб-приложения. Если вы вошли в систему (как определено путем проверки cookie), тогда API-интерфейсы доступны, просто вызывая URL-адрес. Однако я забыл упомянуть, что я обслуживаю API: s для веб-приложения в том же домене. –

+0

Я предполагаю, что пока вы не только полагаетесь на идентификатор сеанса, чтобы идентифицировать пользователя на стороне сервера, это не так. Я думал, что вы можете открыть себя до [Session Hijacking] (http://en.wikipedia.org/wiki/Session_hijacking), но в пятницу после школы вышла, и я устал. Основываясь на ваших ответах на другие вопросы, вы, безусловно, очень знающий парень! Спасибо за вашу помощь! – Steve

0

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

+2

Что вы подразумеваете под словом обслуживания? Это модели внутри контроллеров, которые выполняют весь тяжелый подъем? Если это так, то это мой план - это действительно бит аутентификации, который бросает меня за цикл. Я хочу переместить всю бизнес-логику в отдельный поддомен API, потому что нам нужно будет разоблачить ее для разработки мобильных приложений, и я думаю, что это поможет мне с масштабируемостью в том смысле, что я могу перевернуть вверх или вниз по номеру немых клиентов, подключающихся к API, и просто центральный API обрабатывает все кэширование данных. Я еще не знаю много о масштабируемости, хотя ... – Steve

Смежные вопросы