Защита вашего веб-сервера - всегда очень важная задача, поскольку обычно вы не хотите, чтобы к вашему серверу обращались неавторизованные пользователи. Это руководство должно помочь вам настроить Auth0 вместе с веб-сервером Go с использованием промежуточного программного обеспечения JWT для авторизации.

Оглавление

  • Создать приложение в Auth0
  • Создайте веб-сервер Go с авторизацией JWT
  • Создайте действительный токен доступа JWT

Создать приложение в Auth0

Прежде всего, конечно, вам не нужно использовать Auth0, и вы можете просто реализовать все управление пользователями и подписывать вещи самостоятельно. Но поскольку это требует значительных усилий и вам всегда придется работать с конфиденциальными (пользовательскими) данными, я рекомендую использовать стороннего поставщика, который поможет вам в этом.

В частности, у Auth0 есть очень щедрый бесплатный план, содержащий 7000 MAU (на сегодняшний день), чего должно быть более чем достаточно для небольших приложений. Итак, приступим. Если у вас еще нет учетной записи, создайте новую на https://auth0.com/.

Далее зайдите в «Приложения» и создайте новое приложение.

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

Использование HS256

По умолчанию, RS256 используется Auth0 в качестве алгоритма подписи JWT, хотя HS256 здесь абсолютно хорош, поэтому мы изменим его, чтобы немного упростить нашу жизнь, чтобы нам не приходилось возиться с разными ключевыми файлами, а просто с одним простым секретом.

Приложения → Выберите Приложение → Настройки → Прокрутите вниз → Дополнительные настройки.

Здесь необходимо поставить галочку напротив «OIDC Conformant», чтобы иметь возможность изменить алгоритм подписи на HS256.

И последнее, но не менее важное: выберите свое приложение и скопируйте «Секрет клиента» и сохраните его где-нибудь на потом, так как он нам понадобится. Конечно, убедитесь, что вы НИКОГДА не храните этот секрет в небезопасном пространстве или не передаете его VCS или чему-либо подобному.

Если вы хотите знать, как безопасно хранить свои секреты, вы можете ознакомиться с одной из моих других статей: Защита ваших секретов в Git, безопасный способ использования GCP KMS.



Создайте веб-сервер Go с авторизацией JWT

На следующем этапе мы должны создать наш веб-сервер Go, который обрабатывает запросы и проверяет наличие авторизованных пользователей. Здесь я использую Go Fiber. Создайте новый модуль Go и добавьте следующий код в свой main.gofile. Как всегда, я создал небольшой репозиторий на Github, вы можете проверить его, чтобы увидеть весь проект.



Сам код очень простой. Здесь всего несколько важных частей.

Во-первых, необходимо определить signingKey. Это ваш личный Client Secret, который вы можете скопировать из своего приложения Auth0.

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

В-третьих, к приложению применяется промежуточное ПО JWT для Go Fiber, построенное с signingKey, методом подписи (помните, что мы выбрали HS256 в Auth0) и простой метод фильтрации, позволяющий обходить промежуточное ПО для определенных маршрутов. Всегда могут быть маршруты, по которым вам не нужна авторизация. Хорошими примерами для этого являются, например, общедоступная документация или конечные точки входа / регистрации.

И последнее, но не менее важное: определяются маршруты вместе с методом обработчика и запускается сервер.

Просто запустив go run . в вашем CLI, вы должны запустить веб-сервер Go:

Проверка авторизации

Итак, давайте отправим на сервер несколько запросов, чтобы проверить, все ли работает нормально.

Ограниченный маршрут без JWT

Во-первых, давайте попробуем пройти по ограниченному маршруту вообще без заголовка авторизации.

### Hit restricted route
$ curl -i http://localhost:8080/ping

Как вы можете видеть на следующем изображении, сервер отвечает 400 и сообщает нам, что токен JWT отсутствует или имеет неправильный формат.

Неограниченный маршрут без JWT

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

### Hit unrestricted route
$ curl -i http://localhost:8080/ping/unrestricted

Выглядит неплохо. Сервер отвечает 200 и содержимым метода обработчика, определенного в приведенном выше коде.

Ограниченный маршрут с недопустимым JWT

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

### Hit the restricted route with some invalid token
$ curl -i --header "Authorization: Bearer INVALID_TOKEN" http://localhost:8080/ping

Идеально! Здесь мы получаем 401, говорящий нам, что вызываемый - Unauthorized и что предоставленный JWT распознан, но либо недействителен, либо просрочен.

Ограниченный маршрут с действующим JWT

Теперь мы находимся в точке, где мы наконец хотим проверить, все ли работает правильно в фактическом случае УСПЕХ. Но для этого необходим действующий JWT. Вы можете спросить:

"Отлично, так где же мне взять свой действующий JWT ???"

Если сторонний провайдер авторизации не будет задействован, вы просто подключитесь к своей собственной службе авторизации с действительными учетными данными и получите оттуда JWT. Использование Auth0 немного отличается, но на самом деле, по крайней мере, так же просто.

Создайте действительный токен доступа JWT

К счастью, Auth0 опубликовал веб-сайт https://jwt.io/, где вы можете узнать все о JWT (они также предоставляют бесплатную ~ 100-страничную электронную книгу о JWT), а также закодировать и декодировать ваши JWT.



На главной странице https://jwt.io доступен кодировщик / декодер JWT, где вы можете вставить закодированный JWT в левую часть и проверить декодированный результат справа и / или изменить декодированные значения и сгенерируйте новую закодированную версию слева в реальном времени.

Алгоритм заголовка (alg) и тип (typ) JWT уже правильно настроены для нашего варианта использования. В полезную нагрузку вы можете вставить любую информацию, которую хотите / нуждаетесь. Конечно, закодированное значение по умолчанию недопустимо для вашего приложения, поскольку https://jwt.io не знает ваш секретный ключ подписи. Но вы можете скопировать и вставить его в правом нижнем углу (отмечен на изображении), чтобы создать действительный закодированный JWT.

После того, как вы добавили туда свой секрет и скопировали закодированный JWT, пора проверить успешность авторизации. Итак, снова давайте попробуем вызвать веб-сервер на ограниченном маршруте, только на этот раз с действующим JWT.

curl -i --header "Authorization: Bearer YOUR_TOKEN_HERE" http://localhost:8080/ping

И это работает! Кто бы этого ожидал? 😉

Заключительные слова

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

Спасибо, что нашли время прочитать мою статью.

Если у вас есть какие-либо вопросы или дополнения, не стесняйтесь использовать раздел комментариев или напишите мне в LinkedIn или Twitter, чтобы связаться со мной 😊