Где хранить JWT при подключении к API в Rails - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть приложение Rails, и я пытаюсь подключиться к API.

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

API рекомендует сохранить исходный JWT, чтобы мне не нужно было выполнять дополнительную аутентификациюзапрос на JWT.Они рекомендуют сохранять его на определенное время, а после этого обновлять и получать новый JWT.Токен будет действителен в течение 25 часов, поэтому они рекомендуют получать новый токен через 24 часа, чтобы не прерывать какие-либо службы при получении нового JWT.

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

Просто ищу информацию о лучших практиках и где можно хранить JWT в их приложении.Также не говорите мне слишком общий вопрос, или ТАК не место спрашивать мнения.Я делаю этоБандитская жизнь.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вот решение, которое придумал друг. Я предпочитаю это намного больше. Использование кеша Rails. Кажется, это работает для меня до сих пор. Так думал, что выложу это для будущих поколений. Настройте его так, как считаете нужным для собственного приложения. Пришлось немного подправить, но суть та же.

    def self.fetch_from_api(attributes)
       # use with_token_refresh method here.
       # It will fail if the token is expired, delete the cache, then re-fetch the token.
       with_token_refresh do
         url = build_url(:fetch, attributes[:endpoint], [attributes[:name_id]])
         #call fetch_jwt method and put it in the headers or wherever
         headers = attributes.merge(jwt: fetch_jwt)
         response = execute_request(url, headers(attributes))
         JSON.parse(response)
       end
    end

    def self.fetch_jwt
       # will write if nothing cached, or cache expired, read if something cached
       Rails.cache.fetch('jwt' , expires_in: 24.hours) do
          url =  'test.com'
          headers = { secret: 'stuff' }
          body =  'body'
          resp = RestClient.post url, body, headers
          JSON.parse(resp)['access_token']
       end
    end

    def self.with_token_refresh
       yield
       rescue StandardError
       # delete jwt, then yield to re-fetch
         Rails.cache.delete('jwt')
         yield
    end
0 голосов
/ 10 сентября 2018

согласно auth0

вы храните свои токены в локальном хранилище / хранилище сеансов или в cookie-файлах, в каждом подходе есть свои соображения, но обычно все интерфейсные приложения используют локальное хранилище или хранилище сеансов. для получения дополнительной информации auth0

вы можете изменить / обновить локальный токен JWT, конечно, чтобы повысить вашу безопасность, но я думаю, что это должно быть обработано на уровне приложения (front-end). но безопасность токена JWT должна больше обрабатываться на сервере API

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