我正在做一个项目,其中前端使用 Vue.js 管理,后端使用我的 api 的 elixir / phoenix 框架进行管理。我需要使用 csrf-token 和 JWT 管理我的用户的身份验证。我正在使用 jwt 部分的监护人库(https://hexdocs.pm/guardian/readme.html),我目前正在阻止 csrf_token 部分。
我想生成一个 csrf-token,在从 vue.js 发送登录表单时将其放入 jwt 中,并在用户连接时返回。我阅读了文档,但如果 html 页面不是由 phoenix 生成的,我看不到如何实现 csrf-token。( https://hexdocs.pm/plug/Plug.CSRFProtection.html )
那么如何在我的 vue.js html 页面中使用 phoenix 管理 csrf-token 的生成?
这是我用于连接的路线:
scope "/api", AuthTutorialPhoenixWeb do
pipe_through(:api)
post("/users/sign_in", SessionController, :new)
end
这是我的控制器:
defmodule AuthTutorialPhoenixWeb.SessionController do
use AuthTutorialPhoenixWeb, :controller
alias AuthTutorialPhoenix.Accounts
alias AuthTutorialPhoenix.Authentication.Guardian
action_fallback(AuthTutorialPhoenixWeb.FallbackController)
# new session
def new(conn, %{"email" => email, "password" => password}) do
case Accounts.authenticate_user(email, password) do
{:ok, user} ->
# Lifetime Token of 15 minutes
{:ok, access_token, _claims} =
Guardian.encode_and_sign(user, %{}, token_type: "access", ttl: {15, :minute})
{:ok, refresh_token, _claims} =
Guardian.encode_and_sign(user, %{}, token_type: "refresh", ttl: {7, :day})
conn
|> put_resp_cookie("ruid", refresh_token)
|> put_status(:created)
|> render("token.json", access_token: access_token, user: user)
{:error, :unauthorized} ->
body = Jason.encode!(%{error: "unauthorized"})
conn
|> send_resp(401, body)
end
end
end