2017-02-19 22 views
0

я был в предположении, что create_session если endpoint.ex был настроен на использование куки-магазин, будет установлен заголовок SET-COOKIE ответаcreate_session не устанавливает SET-COOKIE заголовок

# The session will be stored in the cookie and signed, 
    # this means its contents can be read but not tampered with. 
    # Set :encryption_salt if you would also like to encrypt it. 
    plug Plug.Session, 
    log: :debug, 
    store: :cookie, 
    key: "some_key", 
    signing_salt: "some_salt" 

это мой контроллер аутентификации (только часть его)

def callback(%{ assigns: %{ ueberauth_auth: auth } } = conn, params) do 
    params = build_params(auth) 
    user = find_or_create_user params 
    conn = put_session(conn, :current_user, user) 
    IO.inspect conn.resp_headers 
    IO.inspect get_session(conn, :current_user) 
    render conn, "index.html" 
    #Helpers.redirect!(conn, "/") 
    end 

    def build_params(auth) do 
    %{email: auth.info.email, github_token: auth.credentials.token, github_user: auth.info.nickname} 
    end 

    def find_or_create_user(params) do 
    case DBRepo.get_by(User, email: params.email) do 
     nil -> 
      User.changeset(%User{}, params) 
      |> DBRepo.insert 
     results -> 
      results 
    end 
    end 

IO.inspect conn.resp_headers

возвращает

[{"cache-control", "max-age=0, private, must-revalidate"}, {"x-request-id", "vh8l2deodne1k2iloa4c3e4qdpmh857n"}, {"x-frame-options", "SAMEORIGIN"}, {"x-xss-protection", "1; mode=block"}, {"x-content-type-options", "nosniff"}] 
IO.inspect get_session(conn, :current_user) 

возвращает пользователя, как ожидается,

+0

Где определяется 'create_session'? Он должен возвращать соединение, в этом случае вы должны назначить его обратно ('conn = case find_user (...) do ... end'), потому что структуры Elixir неизменяемы. – Dogbert

+0

Существует ли файл cookie в фактическом ответе, отправленном в браузер? Plug.Session устанавливает фактический файл cookie сеанса непосредственно перед отправкой ответа (используя 'register_before_send'), поэтому он не будет отображаться в' conn.resp_headers', но он должен быть там, если вы сделаете реальный запрос. – Dogbert

+0

ОК, я понял, я не мог видеть файл cookie, потому что он был httpOnly: правда спасибо за помощь. Вы хотите получить ответ со всей этой информацией, а также пометить его как ответ :) – Billybonks

ответ

1

Вы не видите куки сессии в resp_headers потому что Plug.Session наборы, которые Cookie just before the response is actually sent, using Plug.Conn.register_before_send. Если вы делаете запрос с использованием любого HTTP-клиента (браузер, curl и т. Д.), Вы увидите заголовок Set-Cookie.

defmodule MyApp.PageController do 
    use MyApp.Web, :controller 

    def index(conn, _params) do 
    conn 
    |> put_session(:foo, :bar) 
    |> text("") 
    end 
end 
$ curl -I localhost:4000 
HTTP/1.1 200 OK 
server: Cowboy 
date: Mon, 20 Feb 2017 08:57:36 GMT 
content-length: 0 
set-cookie: _my_app_key=SFMyNTY.g3QAAAABbQAAAANmb29kAANiYXI.F0G6lsgPxsYjq97tonLy1gRkOBUVcfwqKZdozgGRG-c; path=/; HttpOnly 
content-type: text/plain; charset=utf-8 
cache-control: max-age=0, private, must-revalidate 
x-request-id: uoplksup9ndakf5sdr5shpjsjhvu849v 
x-frame-options: SAMEORIGIN 
x-xss-protection: 1; mode=block 
x-content-type-options: nosniff 
+1

и по умолчанию phoenix добавляет флаг 'httpOnly: true', поэтому вы не увидите его в файле document.cookies – Billybonks