Только Rails API — декодирование Google JWT без пользовательской модели

#ruby-on-rails #ruby #authentication #jwt #google-authentication

#ruby-on-rails #ruby #аутентификация #jwt #google-аутентификация

Вопрос:

Мое приложение разделено на приложение, работающее только с Rails 5 API, и интерфейс React.

Я хотел бы иметь возможность входить во внешнее приложение React с помощью Google и получать JWT.

Для каждого запроса к API я буду отправлять JWT в приложение Rails в качестве заголовка авторизации.

Я хотел бы иметь возможность декодировать этот токен авторизации при каждом действии, чтобы мне не требовались пользовательские модели или сеансы в API. Когда я декодирую JWT, я проверю, соответствует ли электронное письмо определенному URL, и если это не так, я откажу в доступе к методу.

Мой вопрос: как мне правильно и безопасно декодировать JWT из Google? Приложение Google имеет секретный ключ клиента и т.д. Но я не уверен, к чему это приводит в методе декодирования JWT gem.

Когда я декодирую токен авторизации, используя следующие параметры, информация верна. Я не думаю, что это лучший способ, потому что JWT могут быть подделаны, и при использовании этого метода токен фактически никогда не проверяется Google. Вот мой метод аутентификации:

 def authenticate_user
  token = request.authorization
  head 403 and return unless token
  decoded_token = JWT.decode token, nil, false
  hd = decoded_token[0]["hd"]
  head 403 and return unless hd == "example.com"
end
  

Это выполняется в before_action вызове в ApplicationController:

 before_action :authenticate_user
  

Как я уже говорил ранее, это действительно работает. Проблема в том, что он никогда не проверяет идентификатор Google и что любой переданный ему токен может быть подделан по этой причине.

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

У меня есть секрет клиента из моего приложения Google, но я не уверен, где это вообще можно использовать.

Комментарии:

1. сигнатура метода def decode(jwt, key = nil, verify = true, custom_options = {}, amp;keyfinder) похоже, что вторым аргументом будет ваш секретный ключ GitHub Source Я бы убедился, что это переменная среды, потому что в противном случае, если вы используете систему управления общедоступными версиями, ваш секрет не будет секретным очень долго.

2. Спасибо за ваш ответ @enginersmnky. Проблема в том, зачем мне это нужно, если я могу просто декодировать это без него? Что делает добавление этого в even и почему это необходимо, если JWT можно декодировать без его использования? Также как я могу убедиться, что это не поддельный токен и что он, на самом деле, от Google?

3. Я бы предположил, что значение по умолчанию verify = true обеспечит этот шаг проверки. Ваш, вероятно, работает в настоящее время, поскольку вы устанавливаете для verify значение false, поэтому он просто предполагает, что JWT действителен