我有一个使用不记名令牌进行身份验证的API。我想将令牌解码为user_id
,查找用户,并将该用户添加到他们在帖子请求中创建的项目中。
我使用像这样的硬编码用户在项目上下文中正常工作:
def changeset(%Project{} = project, attrs) do
project
|> cast(attrs, [:name, :url])
|> validate_required([:name, :url])
|> put_assoc(:users, [get_user])
end
defp get_user do
Repo.one(from x in User, order_by: [desc: x.id], limit: 1)
end
我还可以解码控制器中的令牌以获得user_id
:
def create(conn, %{"project" => project_params}) do
user_id = SomeFunction.gives.me.an.id
with {:ok, %Project{} = project} <- Projects.create_project(project_params) do
conn
|> put_status(:created)
|> put_resp_header("location", project_path(conn, :show, project))
|> render("show.json", project: project)
end
end
并且,create_project
函数如下所示:
def create_project(attrs \\ %{}) do
%Project{}
|> Project.changeset(attrs)
|> Repo.insert()
end
但是,将user_id
从控制器传递到上下文的最佳方法是什么?
答案 0 :(得分:1)
将参数添加到上下文函数
Projects.create_project(user_id, project_params)
虽然可以说user_id
应该合并到project_params
我觉得应该得到自己的参数。
其他上下文功能很可能也需要当前用户。想想Project.list_projects(user_id)
只返回允许用户看到的项目,或Project.destroy_project(user_id, project_id)
将检查是否允许用户销毁该项目。
将user_id
分配给您的conn
如果user_id
是大多数请求的一部分,您可以使用Plug.Conn#assign/3将其分配给路由器中的conn
。然后,在您的控制器中,您可以使用conn.assigns.user_id
。