sreyansjain

sreyansjain

How to approach Authentication and Authorization in Hologram

Since Hologram is getting production ready, and Authentication and Authorization is a crucial step in making production apps, let’s discuss how to approach authentication and authorization in Hologram.

We can create a login form and then store the user token in a cookie and session. On subsequent pages we can check for the token in the session and get a user struct from the token and put it in the session.

Or

We can use a library like Guardian etc and follow the same steps.

My questions are -

  1. Is this the idiomatic way to do auth in Hologram. Since Hologram routes get called before the Router pipeline in Phoenix, whats the best approach to handle this in the pipeline itself instead of checking it in the init function in every page.
  2. What if the user logs in on another device and clicks log out from all devices. What should happen on the existing device. Should the user be logged out if the tries to invoke any command. If yes, how to do that in an idiomatic way. Or the user should be logged out immediately (it might require Pub- Sub).
  3. Phoenix has introduced scopes that can help in authorization as well as multi tenancy. How can we approach authorization in Hologram. Can we create some pipelines and nest the routes in them?

Getting some guidelines on these would really help move apps to prod. Thanks.

Most Liked

bartblast

bartblast

Creator of Hologram

Hey @sreyansjain, let me address your points:

Planned Lifecycle Method (Setup/Middleware)

Hologram will have a lifecycle method that will be invoked before component/page inits. It will probably be called “setup”, and will be treated as Hologram middleware (in place of Phoenix pipelines in the router).

The middleware will work a little differently than in Phoenix, since Hologram has different architecture and has no router. You’ll be able to create separate modules that you can plug into the setup lifecycle, and you’ll be able to use different “setup” functions in different pages. Or create specialized pages that use specific “setup” functions by default - e.g. instead of use Hologram.Page you could do use MyApp.AdminPage that will have the specialized setup implementation applied.

It will have access to raw headers and will be able to modify the input of the component/page init functions.

Current Capabilities

Since this isn’t implemented yet, I’m not ready to talk about official auth conventions, but since init/3 functions have access to server structs on which you can access/modify cookies and sessions, you can implement most auth behavior today. Commands also have access to server structs and can be authorized in the same way.

  • You can use very similar approaches as in today’s Phoenix auth solutions
  • Your example is reasonable - authenticate a user in an init/3 function and save some token/user_id to a cookie for later authorization
  • You can use any authorization libraries server-side (Guardian building blocks outside plug system, Ash policies, Permit, etc.)

Multi-device logout

Your example of pubsub and logging out of other devices is not a strictly Hologram-related question - this is a universal auth problem and depends on business requirements. The solution you specified seems like a reasonable approach and should be possible once Hologram has pub/sub implemented.


The current capabilities should get you pretty far for production, and the planned middleware system will make it much more ergonomic.

Where Next?

Popular in Questions Top

belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
logicmason
Hi there, I'm working through my first release with elixir/phoenix. I've built a release with distillery and found that it crashes when I...
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New

Other popular topics Top

sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 27727 240
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement