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