Я просто отвечу на вопрос. Полная информация объясняется в этой статье:
https://blog.eq8.eu/article/rails-api-authentication-with-spa-csrf-tokens.html
Учитывая, что Rails устанавливает cookie для SPA
токены CSRF действительны в течение всего времени сеанса. Поэтому да, это нормально, просто сгенерировать один токен CSRF на время сеанса после входа в систему.
class LoginController < ApplicationController
def create
if user_password_match
# ....
cookie[:my_csrf_token]= form_authenticity_token
end
end
end
или вы можете обновить cookie так же, как вы предлагаете
class ApplicationController < ActionController::Base
after_action :set_csrf_cookie
def set_csrf_cookie
cookies["my_csrf_token"] = form_authenticity_token
end
end
Ваш SPA просто должен прочитать cookie и установить его в качестве заголовка.
Оба одинаково действительны
или Вы можете просто предоставить токен CSRF в качестве ответа при входе в систему, и SPA сохранит его где-нибудь и будет использовать в заголовке X-CSRF-Token
:
curl POST https://api.my-app.com/login.json -d "{"email":'equivalent@eq8.eu", "password":"Hello"}" -H 'ContentType: application/json'
# Cookie with session_id was set
# response:
{ "login": "ok", "csrf": 'yyyyyyyyy" }
# next request
curl POST https://api.my-app.com/transfer_my_money -d "{"to_user_id:":"1234"}" -H "ContentType: application/json" -H "X-CSRF-Token: yyyyyyyyy"
Учитывая, что Rails принимает аутентификацию только заголовка
если вы не используете cookie для отправки session_id, значит, ваш API использует только заголовок Authentication
для аутентификации. Тогда вам не нужна защита от CSRF.
Нет файлов cookie сеанса, нет проблем CSRF!
* 1 028 * Пример:
curl POST https://api.my-app.com/login.json -d "{"email":'equivalent@eq8.eu", "password":"Hello"}" -H 'ContentType: application/json'
# No cookie/session is set
# response:
{ "login": "ok", "jwt": "xxxxxxxxxxx.xxxxxxxx.xxxxx" }
# Next Request:
curl POST https://api.my-app.com/transfer_my_money -d "{"to_user_id:":"1234"}" -H "ContentType: application/json" -H "Authentication: Bearer xxxxxxxxxxx.xxxxxxxx.xxxxx"
Еще раз, это только когда вы не используете куки для идентификации пользователя! Таким образом, CSRF не является проблемой в этом случае, но вы все еще защищаете от атаки межсайтовых сценариев, убедитесь, что ваше общение происходит только по HTTP и т. Д ...