Advertisement
Guest User

Untitled

a guest
Aug 10th, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. # web/helpers/session.ex
  2. defmodule MySercetApp.Session do
  3. alias MySercetApp.{Repo, User}
  4.  
  5. def authenticate(%{"email" => email, "password" => password}) do
  6. user = Repo.get_by(User, email: String.downcase(email))
  7.  
  8. case check_password(user, password) do
  9. true -> {:ok, user}
  10. _ -> :error
  11. end
  12. end
  13.  
  14.  
  15. # web/models/user.ex
  16.  
  17. defmodule MySercetApp.User do
  18. use MySercetApp.Web, :model
  19.  
  20. @derive {Poison.Encoder, only: [:id, :username, :email]}
  21.  
  22. schema "users" do
  23. field :username, :string, unique: true
  24. field :email, :string, unique: true
  25. field :encrypted_password, :string
  26. field :password, :string, virtual: true
  27.  
  28. timestamps
  29. end
  30.  
  31. @required_fields ~w(username email)
  32. @optional_fields ~w(encrypted_password)
  33.  
  34. @doc """
  35. Creates a changeset based on the `model` and `params`.
  36.  
  37. If no params are provided, an invalid changeset is returned
  38. with no validation performed.
  39. """
  40. def changeset(model, params \\ :empty) do
  41. model
  42. |> cast(params, @required_fields, @optional_fields)
  43. |> validate_format(:email, ~r/@/)
  44. |> validate_length(:password, min: 5)
  45. |> validate_confirmation(:password, message: "Password does not match")
  46. |> unique_constraint(:email, message: "Email already taken")
  47. |> unique_constraint(:username, message: "Username already taken")
  48. |> generate_encrypted_password
  49. end
  50.  
  51. defp generate_encrypted_password(current_changeset) do
  52. case current_changeset do
  53. %Ecto.Changeset{valid?: true, changes: %{password: password}} ->
  54. put_change(current_changeset, :encrypted_password, Comeonin.Bcrypt.hashpwsalt(password))
  55. _ ->
  56. current_changeset
  57. end
  58. end
  59. end
  60.  
  61. defp check_password(user, password) do
  62. case user do
  63. nil -> Comeonin.Bcrypt.dummy_checkpw()
  64. _ -> Comeonin.Bcrypt.checkpw(password, user.encrypted_password)
  65. end
  66. end
  67. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement