2015-08-11 2 views
0

Я пытаюсь реализовать OAuth с моим клиентским приложением javascript. У меня уже есть сервер.Клиентское приложение и аутентификация/проверка токена OAuth

Мой рабочий выглядит следующим образом:

  • Открыть приложение
  • Проверьте, если маркер присутствует
  • Validate маркер
  • Если нет или не действует идти на OAuth-сервер для маркера
  • Вернитесь в приложение и повторите 2 и 3
  • Я все в порядке, покажи свое приложение

Я не уверен, как реализовать точку 2. Я понимаю, что мне нужно сделать другой вызов для сервера, но где это конечная точка проверки? У меня есть/разрешено,/пользователь и/выход из системы

Также как должен формироваться запрос? Я прикрепляю токен как параметр GET, и все? Что делать, если кто-то перехватывает действительный токен?

+0

Какой первый вопрос. Оуш - большая боль. Проверьте [Oauth bible] (http://oauthbible.com/) и [Oauth for dummies] (https://marktrapp.com/blog/2009/09/17/oauth-dummies/), поскольку они мне помогли. – evolutionxbox

ответ

2

Зависит от вашего приложения, но поскольку у вас есть веб-приложение javascript, которое, скорее всего, не может хранить его учетные данные в секрете, вам необходимо реализовать Implicit Grant, как указано в спецификации OAuth 2.0. Если, однако, ваше приложение МОЖЕТ хранить свои учетные данные в секрете, вы должны реализовать приложение Client Credentials Grant (серверное приложение), поскольку оно более безопасно.

Я не уверен, как реализовать точку 2

Вы должны хранить маркер доступа где-то в вашем веб-приложения, например, в localStorage.

При первом доступе пользователя к вашему веб-приложению у пользователя будет отсутствовать токен доступа и сеанс NO с вашим сервером авторизации. Ваш веб-приложение может увидеть, если у вас есть маркер доступа, делая что-то вроде:

if (!localStorage.getItem('accessToken') { 
    window.location.replace('https://your-authorization-server/authorize?response_type=token&client_id=<CLIENT_ID>&redirect_uri=<CALLBACK_URL>&scope=<SCOPE>'); 
} 

Если нет маркера доступа, вам необходимо перенаправить на сервер авторизации, так что пользователь может войти с сервером авторизации , После того, как пользователь выполнит вход в систему, сервер авторизации перенаправит пользователя обратно в ваше веб-приложение (после того, как пользователь предоставил разрешение на любой ресурс, доступный вашему веб-приложению для доступа от имени указанного пользователя) с действительным токеном доступа. Этот маркер доступа должен быть разоблачен как фрагмент хэш имени access_token, то есть:

https://web-app.com#access_token=123456789X 

Теперь ваше веб-приложение может извлечь маркер доступа и хранить его где-нибудь.

Я понимаю, что мне нужно сделать еще один звонок на сервер для этого , но где конечная точка проверки? У меня только/авторизован,/пользователь и/выход из системы

Вашему серверу авторизации требуется конечная точка проверки маркера.Эта конечная точка будет использоваться вашим веб-приложением для проверки указанного токена (того, который вы где-то хранят, например localStorage). Когда эта конечная точка вызывается с токеном доступа, и оказывается, что токен действителен, пользователь может продолжить, иначе пользователь будет перенаправлен на сервер авторизации. Если у пользователя уже есть сеанс с сервером авторизации, пользователь будет немедленно перенаправлен обратно с новым токеном доступа, иначе пользователь должен сначала пройти аутентификацию (логин).

Также как должен быть сформирован запрос? Я прикрепляю токен как параметр GET , и все?

Некоторые отправляют запрос GET с токеном доступа в качестве параметра запроса url, другие отправляют запрос POST с токеном доступа в качестве полезной нагрузки тела запроса.

Что делать, если кто-то перехватывает действительный токен?

Всегда используйте https, и ваш токен доступа должен быть действительным в течение ограниченного периода времени.

Что-то, о чем следует помнить, заключается в том, что, поскольку ваше приложение не может хранить секретные данные, вам необходимо выполнить команду Implicit Grant, это означает, что вы немедленно получаете токен доступа, когда авторизационный сервер разрешил веб-приложение на основе идентификатора клиента и домен. В отличие от Client Credentials Grant, где вы сначала получаете Authorization Code, который необходимо обменять на токен доступа. При использовании Implicit Grant вы НЕ можете использовать Refresh Tokens. Это означает, что пользователь НЕОБХОДИМО пройти весь поток с сервером авторизации, чтобы получить новый токен доступа. Но это не очень важно, потому что пользователь уже войдет в систему с сервером авторизации, что приведет к немедленной переадресации, поэтому при правильной реализации в веб-приложении пользователь не заметит.

Это просто покрывает его широкими штрихами, это действительно помогло мне (и я советую вам) прочитать OAuth 2.0 spec. Надеюсь, это поможет вам немного, OAuth - сложный вопрос!

+0

Спасибо, у меня получилось, что у меня была конечная точка валькидации. По умолчанию он не был доступен: Для тех, у кого есть подобные проблемы, я нашел здесь ответ: http://stackoverflow.com/questions/26750999/spring-security-oauth2-check-token-endpoint –

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