#elixir #phoenix-framework
#elixir #phoenix-framework
Вопрос:
Я новичок в elixir и phoenix, и это мой первый проект с ним.
В моем приложении я реализовал простую аутентификацию по имени пользователя / паролю с некоторыми маршрутами, требующими аутентифицированного доступа.
Кажется, все идет хорошо, за исключением случаев, когда я делаю перерыв и снова запускаю сервер разработки на следующий день. Когда я пытаюсь получить доступ к домашней странице, браузер показывает «Страница перенаправляется неправильно». Итак, я открыл инструменты разработки, и сервер разработки, похоже, возвращается 302 Found
Location: /
, что приводит к бесконечному перенаправлению.
На терминале сервера разработки при каждом выполненном запросе отображается следующая ошибка (из-за перенаправления).
[error] Ranch listener DemoWeb.Endpoint.HTTP had connection process started with :cowboy_clear:start_link/4 at #PID<0.816.0> exit with reason: {:function_clause, [{:cowboy_http, :commands, [{:state, #PID<0.376.0>, DemoWeb.Endpoint.HTTP, #Port<0.105>, :ranch_tcp, :undefined, %{env: %{dispatch: [{:_, [], [{:_, [], Phoenix.Endpoint.Cowboy2Handler, {DemoWeb.Endpoint, []}}]}]}, stream_handlers: [:cowboy_telemetry_h, :cowboy_stream_h]}, "", %{}, {{127, 0, 0, 1}, 55044}, {{127, 0, 0, 1}, 4000}, :undefined, #Reference<0.1526777474.1731461121.208048>, true, 2, {:ps_request_line, 0}, 65535, 1, :done, 1000, [{:stream, 1, {:cowboy_telemetry_h, {:state, {:cowboy_stream_h, {:state, :undefined, DemoWeb.Endpoint.HTTP, #PID<0.817.0>, :undefined, :undefined, :undefined, :undefined, 0, :nofin, "", 0, ...}}, #Function<0.122385210/1 in :cowboy_telemetry_h."-fun.metrics_callback/1-">, :undefined, %{body_length: 0, cert: :undefined, has_body: false, headers: %{"accept" => "text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "accept-encoding" => "gzip, deflate", "accept-language" => "en-US,en;q=0.5", "connection" => "keep-alive", "cookie" => "_demo_key=SFMyNTY.g3QAAAACbQAAAAtfY3NyZl90b2tlbm0AAAAYME5oeGdhaHF6eXFKSUhXSXI4TEtBNkNVbQAAAA9jdXJyZW50X3VzZXJfaWRtAAAAJDMzYWZiYWFmLWE0YjYtNDQ0NS05M2NkLWJiZDkzMWExMzI2ZQ.CDek9yOjbjBOnr_UyIb2YkEbJzt8GaThoRRmwAVOS50", "host" => "localhost:4000", "upgrade-insecure-requests" => "1", ...}, host: "localhost", method: "GET", path: "/", peer: {{127, 0, ...}, 55044}, pid: #PID<0.816.0>, port: 4000, qs: "", ...}, "200 OK", %{"cache-control" => "max-age=0, private, must-revalidate", "content-length" => "2142", "content-type" => "text/html; charset=utf-8", "cross-origin-window-policy" => "deny", "date" => "Sat, 07 Nov 2020 08:18:59 GMT", "server" => "Cowboy", "set-cookie" => ["_demo_key=SFMyNTY.g3QAAAACbQAAAAtfY3NyZl90b2tlbm0AAAAYR2ZLcnEtaUtiR0xVSUlEWnViZTNxTllBbQAAAA9jdXJyZW50X3VzZXJfaWRtAAAAJDMzYWZiYWFmLWE0YjYtNDQ0NS05M2NkLWJiZDkzMWExMzI2ZQ.PaaEneIk1STc430uXlUm3ItoBnBnp5fdkQFaTr4gILc; path=/; HttpOnly"], "x-content-type-options" => "nosniff", "x-download-options" => "noopen", ...}, DemoWeb.Endpoint.HTTP, -576459137946131486, :undefined, :undefined, :undefined, -576459137573558785, -576459137573558785, %{#PID<0.817.0> => %{...}}, [], ...}}, "GET", :"HTTP/1.1", :undefined, :undefined, 0, []}], [{:child, #PID<0.817.0>, 1, 5000, :undefined}]}, 1, [{:response, "200 OK", %{"cache-control" => "max-age=0, private, must-revalidate", "content-length" => "2142", "content-type" => "text/html; charset=utf-8", "cross-origin-window-policy" => "deny", "date" => "Sat, 07 Nov 2020 08:18:59 GMT", "server" => "Cowboy", "set-cookie" => ["_demo_key=SFMyNTY.g3QAAAACbQAAAAtfY3NyZl90b2tlbm0AAAAYR2ZLcnEtaUtiR0xVSUlEWnViZTNxTllBbQAAAA9jdXJyZW50X3VzZXJfaWRtAAAAJDMzYWZiYWFmLWE0YjYtNDQ0NS05M2NkLWJiZDkzMWExMzI2ZQ.PaaEneIk1STc430uXlUm3ItoBnBnp5fdkQFaTr4gILc; path=/; HttpOnly"], "x-content-type-options" => "nosniff", "x-download-options" => "noopen", "x-frame-options" => "SAMEORIGIN", "x-permitted-cross-domain-policies" => "none", "x-request-id" => "FkUr7USdNzJbU4YAAA0h", "x-xss-protection" => "1; mode=block"}, ["<!DOCTYPE html>n<html lang="en">n <head>n <meta charset="utf-8"/>n <meta http-equiv="X-UA-Compatible" content="IE=edge"/>n <meta name="viewport" content="width=device-width, initial-scale=1.0"/>n <title>Demo App</title>n <link rel="stylesheet" href="/css/app.css"/>n<meta charset="UTF-8" content="FhZ4IAh7KhErdCFlPjwRNypQDEozCy95Qp3RyVCZI3m0wuUm_2iyBEv8" csrf-param="_csrf_token" method-param="_method" name="csrf-token">n <script defer type="text/javascript" src="/js/app.js"></script>n </head>n <body>n <header>n <section class="container">n <nav role="navigation">n <ul>nn <li>nn<a href="/login">Login</a>nn </li>nn </ul>n </nav>n <a href="/" class="phx-logo">n Demon </a>n </section>n </header>n <main role="main" class="container">n<p class="alert alert-info" role="alert"></p>n<p class="alert alert-danger" role="alert"></p>n<section class="phx-hero">n <h1>Welcome to Phoenix!</h1>n <p>Peace of mind from prototype to production</p>n</section>nn<section class="row">n <article class="column">n <h2>Resources</h2>n <ul>n <li>n <a href="https://hexdocs.pm/phoenix/overview.html">Guides amp;amp; Docs</a>n </li>n <li>n <a href="https://github.com/phoenixframework/phoenix">Source</a>n </li>n <li>n <a href="https://github.com/phoenixframework/phoenix/blob/v1.5/CHANGELOG.md">v1.5 Changelog</a>n </li>n </ul>n </article>n <article class="column">n <h2>Help</h2>n <ul>n <li>n <a href="https://elixirforum.com/c/phoenix-forum">Forum</a>n </li>n <li>n <a href="https://webchat.freenode.net/?channels=elixir-lang">#elixir-lang on Freenode IRC</a>n </li>n <li>n <a href="https://twitter.com/elixirphoenix">Twitter @elixirphoenix</a>n </li>n <li>n <a href="https://elixir-slackin.herokuapp.com/">Elixir on Slack</a>n </li>n </ul>n </article>n</section>nn </main>n ", "<iframe src="/phoenix/live_reload/frame" style="display: none;"></iframe>", "</body>", "n</html>n"]}]], [file: '/home/nayminlwin/Lab/phoenix/demo/deps/cowboy/src/cowboy_http.erl', line: 954]}, {:cowboy_http, :loop, 1, [file: '/home/nayminlwin/Lab/phoenix/demo/deps/cowboy/src/cowboy_http.erl', line: 254]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 226]}]}
Я долго смотрел на это и понятия не имею, что с этим делать. Когда я очистил файлы cookie, сайт продолжает работать должным образом.
Кто-нибудь может помочь объяснить, что происходит? Может быть, это каким-то образом вызвано истекшим сеансовым файлом cookie? Если да, то как ее следует правильно очистить?
Заранее спасибо. Дайте мне знать, если вам нужна дополнительная информация.
Комментарии:
1. Не уверен, какой тип аутентификации вы используете, однако у меня такое ощущение, что перенаправление на
/
это поведение по умолчанию по истечении срока действия сеанса. Это бесконечно повторяется, скорее всего, потому, что ваш/
path также использует модуль аутентификации, каждый раз проверяя наличие действительного сеанса.2. Ладно, глупый я.. Я сохранял
/
путь в области маршрутизатора с подключаемым модулем, где разрешены только гостевые пользователи. И подключаемый модуль в этой области перенаправляется обратно/
, если пользователь вошел в систему, что приводит к бесконечному перенаправлению. Был слишком сосредоточен на сообщении об ошибке, чтобы увидеть, что происходит. Я следил за учебным пособием, которое я нахожу в Интернете. Спасибо за ответ.