@benwilson512, @NobbZ, @hauleth
I have the following code in lib/library_api/library.ex
...
def get_user_by_email!(email), do: Repo.get_by!(User, email: email)
...
and in my SessionController lib/library_api_web/controllers/session_controller.ex
defmodule LibraryApiWeb.SessionController do
use LibraryApiWeb, :controller
alias LibraryApi.Library
#alias LibraryApi.Library.User
def create(conn, %{"email" => email, "password" => _password}) do
case Library.get_user_by_email!(email) do
{:ok, user} ->
conn
|> put_view(LibraryApiWeb.SessionView)
|> render("token.json", user: user)
{:error, _reason} ->
conn
|> put_status(:unauthorized)
|> put_view(LibraryApiWeb.ErrorView)
|> render("401.json-api", %{detail: "Error logging in a user with that email and password"})
end
end
end
and in my SessionView: lib/library_api_web/views/session_view.ex
defmodule LibraryApiWeb.SessionView do
use LibraryApiWeb, :view
#import Joken.Config
def render("token.json", %{user: user}) do
mydata = %{id: user.id, email: user.email, username: user.username}
jwt = %{data: mydata, sub: user.id}
|> Joken.generate_and_sign(Joken.Signer.create("HS512", "SOMESECRETVALUE"))
%{token: jwt.token}
end
end
In my database I already was able have the following data:
{
"data": {
"type": "users",
"attributes": {
"email": "maria@hello.com",
"username": "maria",
"password": "asdf",
"password_confirmation": "asdf"
}
}
}
NOTE: password
& password_confirmation
are virtual fields
Using Postman, I am trying to POST
to http://localhost:4000/api/session
the ff. data:
{
"email": "maria@hello.com",
"password": "asdf"
}
that should return a token.
Instead I encounter the following error in my iex console:
iex(1)> [info] POST /api/session
iex(1)> [debug] Processing with LibraryApiWeb.SessionController.create/2
Parameters: %{"email" => "maria@hello.com", "password" => "[FILTERED]"}
Pipelines: [:api]
iex(1)> [debug] QUERY OK source="users" db=0.0ms
SELECT u0."id", u0."email", u0."password_hash", u0."username", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."email" = $1) ["maria@hello.com"]
iex(1)> [info] Converted error {:case_clause, %LibraryApi.Library.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, email: "maria@hello.com", id: 4, inserted_at: ~N[2019-05-12 08:41:18], password: nil, password_confirmation: nil, password_hash: "$2b$12$7qHpuOzPJaJShZoO4DCmAe9K/vHvsGwGPRlVmGzHQUlLkCBpgOZ82", updated_at: ~N[2019-05-12 08:41:18], username: "maria"}} to 500 response
iex(1)> [info] Sent 500 in 109ms
iex(1)> [error] #PID<0.435.0> running LibraryApiWeb.Endpoint (connection #PID<0.434.0>, stream id 1) terminated
Server: localhost:4000 (http)
Request: POST /api/session
** (exit) an exception was raised:
** (CaseClauseError) no case clause matching: %LibraryApi.Library.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, email: "maria@hello.com", id: 4, inserted_at: ~N[2019-05-12 08:41:18], password: nil, password_confirmation: nil, password_hash: "$2b$12$7qHpuOzPJaJShZoO4DCmAe9K/vHvsGwGPRlVmGzHQUlLkCBpgOZ82", updated_at: ~N[2019-05-12 08:41:18], username: "maria"}
(library_api) lib/library_api_web/controllers/session_controller.ex:7: LibraryApiWeb.SessionController.create/2
(library_api) lib/library_api_web/controllers/session_controller.ex:1: LibraryApiWeb.SessionController.action/2
(library_api) lib/library_api_web/controllers/session_controller.ex:1: LibraryApiWeb.SessionController.phoenix_controller_pipeline/2
(library_api) lib/library_api_web/endpoint.ex:1: LibraryApiWeb.Endpoint.instrument/4
(phoenix) lib/phoenix/router.ex:275: Phoenix.Router.__call__/1
(library_api) lib/library_api_web/endpoint.ex:1: LibraryApiWeb.Endpoint.plug_builder_call/2
(library_api) lib/library_api_web/endpoint.ex:1: LibraryApiWeb.Endpoint.call/2
(phoenix) lib/phoenix/endpoint/cowboy2_handler.ex:33: Phoenix.Endpoint.Cowboy2Handler.init/2
(cowboy) d:/@@@/@gilbertc77/library_api/deps/cowboy/src/cowboy_handler.erl:41: :cowboy_handler.execute/2
(cowboy) d:/@@@/@gilbertc77/library_api/deps/cowboy/src/cowboy_stream_h.erl:296: :cowboy_stream_h.execute/3
(cowboy) d:/@@@/@gilbertc77/library_api/deps/cowboy/src/cowboy_stream_h.erl:274: :cowboy_stream_h.request_process/3
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3