trivialcase
I have a piece of code that gets executed on successful user signin, and everything seems to work fine, except that one of my assigned variables isn’t getting assigned by the code, but it works fine when I do it while debugging with pry…
Here is my code:
case TokenAuthentication.verify_token_value(token) do
{:ok, user} ->
conn
|> put_session(:user_id, user.id)
|> configure_session(renew: true)
|> put_flash(:info, "Congratulations, #{user.first_name}, you were signed in successfully.")
|> assign(:current_user, user)
IEx.pry
|> redirect(to: page_path(conn, :index))
and when I pry I have
assigns: %{current_user: nil}
but then I do assign(conn, :current_user, user) at the prompt and I get
assigns: %{current_user: %Myapp.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">,
auth_tokens: #Ecto.Association.NotLoaded<association :auth_tokens is not loaded>,
email: "test@test.com", first_name: "Test", id: 20,
inserted_at: ~N[2017-05-09 13:06:32.374191], last_name: "McTest",
password: nil, password_confirmation: nil,
password_hash: "$2b$12$v8zTVSz0TGJ6COKlGb0TY.pbg3lnpJMZprmjDz3OS6s5aZWIDgsaC",
updated_at: ~N[2017-05-09 13:06:32.374206]}}
as expected. I know that Elixir shouldn’t have side effects, so how is my running it at the prompt different?
Trending in Questions
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
benwilson512
Your code isn’t quite doing what you think it is. Here it is formatted better:
If I had to guess
IEx.prywill return whatever it is you’ve last written in it. So if you assign a conn, that assigned conn will get passed through to the redirect function.Aetherus
Remember that all data structures in Elixir are immutable, so is a
%Plug.Conn{}.Plug.Conn.assign/3always returns a new%Plug.Conn{}. So your code should beNote that the local variable
connis reassigned.trivialcase
Exactly right, thank you, I think I should have seen that.
If you don’t mind indulging me a little further, the reason I am debugging this is that the
current_usernever makes it to my template. Here’s my authentication scheme:(1) User signs up, generate a jwt using
Guardian.encode_and_sign, send a verification email to the new user with a link containing the token(2) User clicks the link, the jwt is checked by
Guardian.decode_and_verify, then that code above is executedNow that I think about it, the problem seems to be that the redirect sends the connection back through the router where it hits my pipeline, which resets
current_useranyway:But I’m guessing that this is the problem, somehow the non-Plug functionality of Guardian and the Plug stuff don’t work together. I don’t suppose anyone knows off-hand how these pieces of Guardian should work together, i.e. should I somehow be doing a
Guardian.Plug.sign_infor the user once their link is verified? I am a little worried that the token from the email verification process is still floating around out there and might muck up the works.Aetherus
I’m not familiar with
Guardianso excuse me if I’m wrong.Since you’re using token authentication, the token should be maintained by the client side code (e.g. javascript on the browser side). The client should carry the token on every request whenever the token is available.
However, redirect is a two-step action:
302and aLocationheader, which contains a URL.GETrequest immediately to the URL inLocationheader.Unfortunately, you can’t control the second step. You can’t add headers to it, you can’t specify the HTTP method, you can’t add cookie to it, and you can’t attach token to it. I think this is the reason why you lose the
current_userafter redirect.If you are building a single-page application, try not to use redirect. Let Javascript handle page switching.
trivialcase
Thanks, that was part of the problem. I was also right that I needed to use Guardian to sign in after verifying the emailed token-link. I should probably put together a little article detailing the process of setting up passwordless authentication using the Guardian library since everything I’ve seen so far uses Phoenix.Token, which doesn’t have a very thorough set of functions.
OvermindDL1
Guardian is useful if you need JWT. If you are just using it as a token you really should be using Phoenix.Token. And the reason Phoenix does not include little pipeline helpers for it is that they are so simple to write that most just write them straight in their router to call in their pipeline.
If however you want a set of pre-made ones I know there are a couple up on hex.pm.
trivialcase
Thanks! I’m super new to this so I only barely know what I’m doing, just sort of having fun learning. Is there somewhere to learn how to do that? I also have an API that is in Guardian, which is why I used it here too, maybe I should drop it altogether?
OvermindDL1
Ehh, depends. If it is already in production, no, no point breaking existing things. If it is not but you are using some of the JWT specific features or plan to, then keep guardian, and use it everywhere to keep things ‘uniform’. If you just need a token everywhere with no special JWT stuff then use phoenix tokens everywhere.
Lots of docs all over google (this is not really phoenix specific) but I do not have any ready on hand. ^.^;
trivialcase
Lol yea it’ll be a while before I’m worrying about production. This is the first time I’m learning how to make apps in any language, I just chose Elixir/Phoenix because it sounded fun (and I have a math background, there is something that feels math here…). I’ve noticed that if you don’t already have a background in Rails or Node, etc, that learning materials can be a little tough to come by. But it’s all good, fun all the same.
OvermindDL1
I came from the erlang world instead of the rails/node world, the concepts clicked, but wow it has a weird structure to me, it still does. ^.^