2016-05-20 4 views
3

Я использую OAuth2 example (с Google) для аутентификации моего веб-приложения Phoenix. Хотя мой сайт требует, чтобы пользователь всегда регистрировался или аутентифицировался. Нет регистрации пользователя или анонимного доступа.Как требовать логина в приложении Elixir Phoenix?

У меня есть часть OAuth2, работающая с использованием Google в качестве поставщика. Хотя я не уверен, как требовать, чтобы пользователь перенаправлялся на страницу входа в систему, если они не вошли в систему.

Может ли кто-нибудь представить пример рабочего кода?

Вот мой web\router.ex:

defmodule MyApp.Router do 
    use MyApp.Web, :router 

    pipeline :browser do 
    plug :accepts, ["html"] 
    plug :fetch_session 
    plug :fetch_flash 
    plug :protect_from_forgery 
    plug :put_secure_browser_headers 
    plug :assign_current_user 
    end 

    pipeline :api do 
    plug :accepts, ["json"] 
    end 

    scope "/", MyApp do 
    pipe_through :browser # Use the default browser stack 
    get "/users", UserController, :index 
    get "https://stackoverflow.com/users/:id", UserController, :show 
    get "/", PageController, :index 
    end 

    scope "/auth", MyApp do 
    pipe_through :browser # Use the default browser stack 
    get "/:provider", AuthController, :index 
    get "/:provider/callback", AuthController, :callback 
    delete "/logout", AuthController, :delete 
    end 

    # Other scopes may use custom stacks. 
    # scope "/api", MyApp do 
    # pipe_through :api 
    # end 

    # Fetch the current user from the session and add it to `conn.assigns`. This 
    # will allow you to have access to the current user in your views with 
    # `@current_user`. 
    defp assign_current_user(conn, _) do 
    assign(conn, :current_user, get_session(conn, :current_user)) 
    end 
end 

UPDATE 05/23/2016

Используя часть выбранного ответа ниже, я получил эту работу путем изменения моей web\router.ex:

defmodule MyApp.Router do 
    use MyApp.Web, :router 

    pipeline :browser do 
    plug :accepts, ["html"] 
    plug :fetch_session 
    plug :fetch_flash 
    plug :protect_from_forgery 
    plug :put_secure_browser_headers 
    plug :assign_current_user 
    end 

    pipeline :authenticated do 
    plug :authenticate 
    end 

    pipeline :api do 
    plug :accepts, ["json"] 
    end 

    scope "/", MyApp do 
    pipe_through [:browser, :authenticated] # Use the default browser stack 

    get "/", PageController, :index 
    resources "/users", UserController, only: [:index, :show, :new, :create] 
    end 

    scope "/auth", MyApp do 
    pipe_through :browser # Use the default browser stack 

    get "/:provider", AuthController, :index 
    get "/:provider/callback", AuthController, :callback 
    delete "/logout", AuthController, :delete 
    end 

    # Other scopes may use custom stacks. 
    # scope "/api", MyApp do 
    # pipe_through :api 
    # end 

    # Fetch the current user from the session and add it to `conn.assigns`. This 
    # will allow you to have access to the current user in your views with 
    # `@current_user`. 
    defp assign_current_user(conn, _params) do 
    assign(conn, :current_user, get_session(conn, :current_user)) 
    end 

    defp authenticate(conn, _params) do 
    if conn.assigns.current_user do 
     conn 
    else 
     conn 
     |> put_flash(:error, "You must be logged in.") 
     |> redirect(to: "/auth/google") 
     |> halt() 
    end 
    end 
end 

ответ

3

Я никогда не делал этого с OAuth2, но в обычном приложении Phoenix стандартным способом это использовать функцию, которая будет передана в разъем контроллера. Например:

defmodule App.AdminController do 
    use App.Web, :controller 
    plug :authenticate when action in [:index, :new, :create, :update, :delete] 

с функцией AUTHENTICATE существа:

def authenticate(conn, _params) do 
    if conn.assigns.current_user do 
     conn 
    else 
     conn 
     |> put_flash(:error, "You must be logged in to do that.") 
     |> redirect(to: page_path(conn, :index)) 
     |> halt() 
    end 
    end 

Функция проверяет, есть ли current_user назначен. Если у него есть, то conn передается как его. Если это не так, тогда вставляется вспышка, указывающая пользователю, что он должен войти в систему, пользователь перенаправляется на первую страницу, а соединение останавливается.

EDIT: Как вы можете видеть в первом фрагменте, это будет работать только с указанными вами действиями. Если вы хотите сделать это во всем приложении, вы можете поместить его в вспомогательный модуль.

EDIT2: Вы можете обратиться к книге программирования Phoenix, где это объясняется более подробно.

0

Я использую Phoenix_Token_Auth на своем веб-сайте. Это довольно просто, если вы читаете wiki, как есть пример.

https://github.com/manukall/phoenix_token_auth

Надеется, что это полезно для вас!

 Смежные вопросы

  • Нет связанных вопросов^_^