Authenticating A Newly Registered User
In this lesson, we'll learn how we can authenticate, or login, a new user who just registered with our application. We'll then see how we can populate the authenticated user's details on subsequent requests.
- Author
- Tom Gobich
- Published
- Apr 20
- Duration
- 4m 14s
Developer, dog lover, and burrito eater. Currently teaching AdonisJS, a fully featured NodeJS framework, and running Adocasts where I post new lessons weekly. Professionally, I work with JavaScript, .Net C#, and SQL Server.
Adocasts
Burlington, KY
Transcript
Authenticating A Newly Registered User
-
[MUSIC]
-
So within our register controller here,
-
we have our user actually being created already.
-
And we know if we dive into our model for our user,
-
we're making use of the AuthFinder mixin,
-
where we've defined our UID as well as our password column.
-
And as the first argument, we're also providing a callback function
-
with the specific hash mechanism that we wanna use for our password.
-
And if we dive into our browser and take a look at this AuthFinder mixin,
-
we'll see as the first parameter, it's accepting in a callback function
-
with our hash mechanism as we just saw within our code,
-
as well as options for the UIDs array, as well as the password column name here.
-
Then the AuthFinder is essentially a composable class mixin
-
that will apply to the class that we're composing it into,
-
a before save hook that's in charge of using that hash mechanism
-
that we provide in to hash our user's password column
-
before it's actually saved into the database.
-
Which is why if we now dive into pgAdmin and head down to our tables for our user,
-
right-click that, view edit data, and let's just select the first 100 rows here.
-
If we scroll over to their password column, it is hashed,
-
and specifically it's hashed using script.
-
So it's that with AuthFinder mixin that we're making use of
-
that's doing that automatically for us so that we don't need to worry about it.
-
All that leaves for us to do whenever we're registering a user
-
within our register controller is to log in that user.
-
So let's go ahead and get rid of our console lock here and let's log that user in.
-
So first, what we're going to want to do is use the auth module out of our HTTP context.
-
With that, we can await auth.use our web guard to log in
-
and provide in the user that we've created.
-
Once we have that, we will have created the user as well as log them into our application.
-
So if we give that a save, jump back into our browser,
-
let's head over to our register route and let's type some stuff in.
-
So we'll do auth user1, [email protected], and some valid password there.
-
We'll hit enter and we're redirected back to our homepage.
-
Furthermore, if we take a look at our terminal, we don't see any errors.
-
So how can we check to see whether or not our user is actually authenticated now?
-
We don't have anything currently denoting that the user is authenticated.
-
Well, what we could do is hide away our login and register if they are,
-
and instead maybe show their name.
-
So let's hide our browser back away.
-
Let's jump down into our resources, views.
-
Let's go into our nav partial and let's wrap these two anchors in an if.
-
So we'll do @if and we have globally available throughout Edge,
-
auth, the same auth module that we have within our controllers,
-
and our authenticated users details will be populated on user.
-
However, we'll see here in a second that this won't be the case for us quite yet.
-
So let's end if and then do an @else and plop the anchors that we've copied inside the else,
-
and we'll do auth user full name if the user is authenticated.
-
So if they're authenticated, we should see their full name here.
-
If they're not, then we'll see our login and register anchors.
-
Again, we have one more step to take care of to get this auth user to actually work.
-
So if we were to dive into our browser at this point,
-
give it a refresh, in the eyes of this request,
-
it doesn't know whether or not our user is actually authenticated
-
because we haven't informed it to check for an authenticated user in the first place.
-
So what we can do is dive up to our movies controller,
-
grab auth out of the index method for this,
-
auth there, and we can now do await auth.
-
and tell it to check for an authenticated user.
-
If it finds one, at this point onward, auth.user will be populated.
-
Otherwise, it will just continue onward with auth user being null.
-
Okay. So if we give that a save now,
-
jump back into our browser, give it a refresh.
-
Okay, cool. So now we see auth user one up here.
-
So the request is now noting that we are authenticated and has populated our auth.user.
-
However, we're only doing that for our index page.
-
If we were to dive into, say,
-
our writers, we're back to being logged out in the eyes of this particular request,
-
because we haven't checked for an authenticated user for this route.
-
If we dive back into our home, there's our auth user again.
-
Okay. So what we could do is let's remove auth check from our index page,
-
and instead, within our navigation where we're actually performing that check,
-
we can do if await auth,
-
and then just do check there,
-
and this will return back true if it does find a user or false if it does not.
-
So it's essentially performing the same check here.
-
Jump back into our browser,
-
give it a refresh once more,
-
and our auth user is still here.
-
But if we now dive into our writers,
-
it now knows our auth user is there as well,
-
because we're now informing it to check for that authenticated user.
-
Introduction
-
Fundamentals
-
2.0Routes and How To Create Them5m 23s
-
2.1Rendering a View for a Route6m 29s
-
2.2Linking Between Routes7m 51s
-
2.3Loading A Movie Using Route Parameters9m 17s
-
2.4Validating Route Parameters6m 6s
-
2.5Vite and Our Assets6m 38s
-
2.6Setting Up Tailwind CSS9m 5s
-
2.7Reading and Supporting Markdown Content4m 32s
-
2.8Listing Movies from their Markdown Files8m 51s
-
2.9Extracting Reusable Code with Services7m 4s
-
2.10Cleaning Up Routes with Controllers4m 52s
-
2.11Defining A Structure for our Movie using Models9m 38s
-
2.12Singleton Services and the Idea of Caching6m 11s
-
2.13Environment Variables and their Validation4m 16s
-
2.14Improved Caching with Redis10m 44s
-
2.15Deleting Items and Flushing our Redis Cache6m 46s
-
2.16Quick Start Apps with Custom Starter Kits6m 28s
-
2.17Easy Imports with NodeJS Subpath Imports8m 40s
-
-
Building Views with EdgeJS
-
3.0EdgeJS Templating Basics8m 49s
-
3.1HTML Attribute and Class Utilities6m 9s
-
3.2Making A Reusable Movie Card Component10m 24s
-
3.3Component Tags, State, and Props4m 53s
-
3.4Use Slots To Make A Button Component6m 56s
-
3.5Extracting A Layout Component5m 13s
-
3.6State vs Share Data Flow2m 59s
-
3.7Share vs Global Data Flow6m 7s
-
3.8Form Basics and CSRF Protection6m 13s
-
3.9HTTP Method Spoofing HTML Forms3m 3s
-
3.10Easy SVG Icons with Edge Iconify7m 57s
-
-
Database and Lucid ORM Basics
-
4.0Configuring Lucid and our Database Connection4m 3s
-
4.1Understanding our Database Schema9m 35s
-
4.2Introducing and Defining Database Migrations18m 35s
-
4.3The Flow of Migrations8m 28s
-
4.4Introducing Lucid Models5m 43s
-
4.5Defining Our Models6m 49s
-
4.6The Basics of CRUD11m 56s
-
4.7Defining Required Data with Seeders11m 11s
-
4.8Stubbing Fake Data with Model Factories13m 48s
-
4.9Querying Our Movies with the Query Builder15m 30s
-
4.10Unmapped and Computed Model Properties3m 24s
-
4.11Altering Tables with Migrations7m 6s
-
4.12Adding A Profile Model, Migration, Factory, and Controller2m 57s
-
4.13SQL Parameters and Injection Protection9m 19s
-
4.14Reusable Query Statements with Model Query Scopes8m 11s
-
4.15Tapping into Model Factory States9m 15s
-
4.16Querying Recently Released and Coming Soon Movies4m 59s
-
4.17Generating A Unique Movie Slug With Model Hooks7m 59s
-
-
Lucid ORM Relationships
-
5.0Defining One to One Relationships Within Lucid Models5m 49s
-
5.1Model Factory Relationships2m 54s
-
5.2Querying Relationships and Eager Vs Lazy Loading5m 17s
-
5.3Cascading and Deleting Model Relationships5m 16s
-
5.4Defining One to Many Relationships with Lucid Models6m 56s
-
5.5Seeding Movies with One to Many Model Factory Relationships5m 24s
-
5.6Listing A Director's Movies with Relationship Existence Queries8m 41s
-
5.7Listing and Counting a Writer's Movies8m 41s
-
5.8Using Eager and Lazy Loading to Load A Movie's Writer and Director5m 18s
-
5.9Defining Many-To-Many Relationships and Pivot Columns9m 48s
-
5.10Many-To-Many Model Factory Relationships4m 50s
-
5.11A Deep Dive Into Relationship CRUD with Models18m 5s
-
5.12How To Create Factory Relationships from a Pool of Data13m 55s
-
5.13How To Query, Sort, and Filter by Pivot Table Data9m 47s
-
-
Working With Forms
-
6.0Accepting Form Data12m 15s
-
6.1Validating Form Data with VineJS9m 29s
-
6.2Displaying Validation Errors and Validating from our Request7m 16s
-
6.3Reusing Old Form Values After A Validation Error2m 3s
-
6.4Creating An EdgeJS Form Input Component5m 28s
-
6.5Creating A Login Form and Validator5m 1s
-
6.6How To Create A Custom VineJS Validation Rule9m 7s
-
-
Authentication & Middleware
-
7.0The Flow of Middleware7m 49s
-
7.1Authenticating A Newly Registered User4m 14s
-
7.2Checking For and Populating an Authenticated User2m 10s
-
Logging Out An Authenticated User2m 24s
-
Logging In An Existing User6m 54s
-
Remembering A User's Authenticated Session6m 55s
-
Protecting Routes with Auth, Guest, and Admin Middleware5m 36s
-
-
Filtering and Paginating Queries
-
Creating A Movie List Page3m 43s
-
Filtering A Query By Pattern Likeness7m 9s
-
Filtering Our List by Movie Status5m 47s
-
How To Apply A Dynamic Sort Filter To Your Query7m 12s
-
Joining SQL Tables To Order By A Related Column4m 49s
-
Validating Query String Filter Values7m 23s
-
How To Paginate Filtered Query Results9m 15s
-
Pagination First, Last, Next, and Previous Buttons4m 2s
-
Join The Discussion! (0 Comments)
Please sign in or sign up for free to join in on the dicussion.
Be the first to Comment!