Next Auth Credentials Provider - Ultimate Guide

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
today we are going to learn about the credentials provider inside of next auth and we are going to use mongodb for a database prism as the orm and we're using next js13 as the framework so before we get started if you can hit that like button and also subscribe for more that would be great other than that let's get to coding okay so if you haven't already you can create a next js13 project inside of your terminal on your computer system I'm using version 13.4.9 for this video if you're watching the future it might be a different version but everything should be the same so we are using the app directory inside of an xjs and what we're doing in this video is we are creating a next auth credentials provider this means this allows us to handle the sign in with the username and password there's other providers like the Google provider and the GitHub the Facebook provider I do in my channel have a ultimate next auth guide that is about an hour and a half long it will be linked right here at the top of this video you could click that and you can watch that guide as well but let's just continue with what we're doing and the first thing I want to do is I want to install the next auth package so I'm going to open up the terminal now I'm going to say npm install next Dash auth and since I am down here I'm going to install one more thing and that is going to be B Crypt because we are going to Hash the password before we send it to our mongodb database so we're going to install those two packages right off the bat after they have been successfully installed we are going to create a catch all route inside of our API folder so we don't have an API folder so we're going to create that inside of the app directory and then inside the API folder we're going to have another folder called auth and then inside of that folder we are going to have a catch-all route and this syntax is a bracket notation and it's a spread syntax so dot dot dot next auth bracket and then it's either going to be route JS or TS depending on if you're using typescript or not so we're going to use route.js and now we can start defining this main entry point that allows us to connect to next auth so the first thing we have to do is we have to import at the top so import next auth from next auth forward slash next we are going to use the credentials provider so we can import that as well so it's going to be called credentials provider just like that and this is from next auth forward slash providers forward slash credentials and we could import bcrypt as well because we're going to actually use it here in this file as well so we're installing bcrypt from B Crypt not b-crypt.js bcrypt and the other thing we want to do is now we want to actually start defining our function down here so what we're going to do is we're going to say export cons we're going to call this auth options and if you do want to know where all the auth options are you can look inside of the docs and it shows you all the different options you could pass into the next auth object so you could pass adapters you could pass providers you could pass secrets you could pass debug you could pass a bunch of asynchronous callbacks that do important tasks when a certain event happens but we'll get to everything you need to do specifically for the credentials provider so the first thing is we are going to send the username and password and name back into our database so what we have to do here is we are going to connect connect our database with prism which is orm to our application so I'm going to pull up the docs real quick just to show you guys we if you could go to the docs it's the next authjs.org you could go to the search or you could go over here to these tabs and what we want is we want adapters and we're going to use prism we can use mongodb but prism is is the same thing we could use both so this means we have to install this package and it tells us how to set it up inside of our catch-all route and then we could go from there so let's copy these two here these two lines and we go back in our terminal and paste them in so we're going to install the prism client and the prism adapter for next auth so we installed both of those packages so the first option I want to pass through is called the adapter and this adapter is going to take in the prism adapter which has to be imported at the top just like that and we could pass through prism so what we could do here is we need to also import the prism client so then we also need to install prism as well so we could just click npm install prism right down below we install prism now we can import at the top and we can import the prism client from Prism forward slash client after this we can now initialize the prism client this is going to allow us to use the CLI from Prism and we could pass it through our prism adapter just like this after initializing prism client just like it shows right here in the docs we can scroll down and we need to create the prism schema from scratch so this just verifies the types we are sending to our database so right here we can actually copy this whole schema.prism file right here and the only thing we're actually using inside of this but we're going to keep it all for our code is we're using the data source DB object we're using the generate client object and we are going to use the user model right here so they have other models like the session and the account and the verification token but what you need for the credentials provider is the user if you're using like a Google provider or GitHub provider you are going to need the account schema right here just like this so like I said copy this right here we are going to go back to our code in the root of our whole op application we were going to create a folder called prism inside of that we will call a schema dot prism and then we can just copy that whole code and then the thing we're going to change is we are not using postgres SQL we are using mongodb and it's going to throw you errors reason why is if we go back to that Doc Page right here if you scroll down we have to change a few things to support for mongodb and the things we have to change is the IDS because the ID stored in mongodb start with the underscore ID so we have to put this decorator behind every ID and then we also have to put something else which I'll show you right after we do the IDS so we're going to replace these with looking like this so we're going to map it through looking like underscore ID we got to do it for every ID just like that and for the user just like that and then what we could do here is we don't need the verification token and for the user ID string what we're going to have to do in this file is we are going to make this a at DB dot object ID and then it fixes the error for the user IDs so these need to be object IDs same thing with these right here so we scroll back up the user ID needs to be DB dot object ID and then for the refresh token in the access token it's not DB text that's just specific for SQL there's not for mongodb so we can remove those there and now we have no more errors and then we could also remove preview features because we won't need this if you're using prism version 3 or higher which we are and then you also don't need the shadow data database URL and this is how your schema file should look now I want to create the database inside of mongodb so we could actually connect our application to the database so we're going to Google search mongodb and then it should be the first search and then after that we can sign in and then you can either log into Google GitHub or an email address we're going to slogan with Google and then after you log in or sign up you should land on a page that is very similar to this and if not you just try to go to this page right here and either you click the green button here that says create or up here at the top left we will create a new project and then we have to name the project so we can name this next auth credentials video name it whatever your Project's name is you don't have to add any members so we're going to click create project we're going to build the database we're going to use the free version right here to the right we'll use AWS as the provider select your recommended region with the star depending on where you live you could change the cluster it's only on the server side so you're the only one who sees inside the database so I'm going to leave mine as is we'll click create now the most important step is your username and password so I'm gonna have a username of B Westwood 11. I will keep that password I will copy it open up my notepad paste it in my notepad which is on another screen that's why you can't see it and then we're clicking create users so make sure you know the password before clicking create user you click it we're going to use the local environment and then also for the IP address if you want it to reach all IP addresses you're going to put 0.0.0 forward slash zero that means any IPA address and any computer can access the database if need be so we're going to say finish and close go to databases this should take either a few seconds or a few minutes to deploy your database and after it is deployed you're just going to see a green Circle right here that says active it says right now status updating so what we can do for now is we could click connect and we are going to connect via drivers so connect your application and actually we're not going to connect to the drivers we're going to just do it for vs code directly so we are going to copy this URI string right here and what we are going to do is we are going to go back to our vs code editor we are going to have a new file in the root called dot EnV we will call this we are going to call this database URL the reason why is because that is how we're going to connect prism to our database that's what it's called so we're going to copy this we're going to paste it and now we have to actually go back and copy this again we're going to press equal and then paste so that's going to connect our code and then we got to replace the password with that password that we saved in our notepad just about a minute ago so we are going to paste this in and now we have the mongodb URI string right there that we were able to connect to our prism schema and it is good to go just like that so now we are back inside of the catch all route inside of the API folder and app directory and the first option we passed inside the auth options object is the adapter so we successfully set up the adapter prism and mongodb next we want to pretty much initialize and say what provider we are going to use so you could use a bunch of providers but we are only using one for this tutorial and that is going to be in an array so it's going to be inside of an array and the one we're using is the credentials provider and the first parameter to pass is we have to name it credentials and we are going to have to name a credentials and the reason why is because we're actually going to use this later on to be able to sign in and then inside of the credentials we could start labeling a few things because next auth does provide a pre-built login and register page for you to log in and test out everything you want to do I'm not going to go to that page but there is a specific URL you get to follow and we are going to create our own custom login and register page using some Tailwind CSS um components so what we're going to do is we could just say username and then we're gonna have a label of username type of text and placeholder you just have as jsmith not a big deal next we are going to have the password and then we are going to close the credentials provider after that this is the Callback that is always and only called inside of the credentials provider called the authorized callback so this only initiates when you are trying to log in so this is where all your login functionality logic is going to go so this is where we're going to check the user database to see if the user is actually there then if they aren't there we're going to make sure the passwords match and then if the passwords do match we're just going to return the user so they could actually log in and I'll show you how to set that all up but we are just going to close this right now just like that and then right below this let's close their credentials provider and then we are going to go below the um providers tab right here where the array is and then right below that we are going to have a session and we are going to have an object that says strategy is true I mean strategy is JWT this is a Json web token and that is going to allow us to track users via Json web tokens so we're going to initialize it just like this so all of these are objects inside of the auth options and they're pretty much options inside of next auth documents so right below the session we could Define a secret the secret is not necessary but the secret is necessary in production so you might as well do it in development so you don't forget so it should be process dot EnV and then we're going to have uppercase next auth and then underscore secret so we're going to copy this and the secret is just going to allow us to actually use the JWT token so inside the EnV file we could paste this equal sign and then we could have any secret you want you could just start randomly typing stuff on your keyboard and what we are going to do here is we could just do this as a string and then just go like this and then there's a string like that and then the one thing I want to make sure that you do beforehand is as you see in the database underscore URL we actually want to send this to a specific collection so I'm just going to name this user just like that because if you don't you it's not going to work you're going to actually get errors thrown at you so let's close both these files go back to our catch all route again and inside of the catch-all route you can have another option called debug so debug is literally going to debug your code based on any errors thrown on next outside so you could literally have a process.env node underscore EnV equals development it's going to throw debug errors that means in development we're going to get errors when you push a production it's not going to throw any errors so this allows us to code easier and more efficient so after the auth options down below we're going to initialize a Handler and then we're going to use the next auth that we import at the top and then we're going to pass through the auth options just like that inside of the next auth um import and then we have to export it using HTTP request so it's going to be a Handler as a get and then Handler as posts this is going to allow this route to take any git and post requests that next auth provides so that allows us for sign in functionality logout functionality any kind of functionality that nexauth provides is usually a get request or a post request and this is a catch-all route so the only thing we're going to have to come back and do inside of this catch-all route is we're going to have to define the logic inside of the authorized callback function next though we are going to start working on the register page so to do that I'm going to go before we even do that I'm going to clean up my folders and files a little bit I'm going to remove everything in the global CSS the set lines one through three inside of page.js which is our home page I'll remove everything inside of the main we will have a main element tag as well we have H1 that says next authjs we can have a link component so we could actually navigate to specific pages it takes in the href and we will go to forward slash register and then we're going to say register page and then we'll also have a login page and this is going to be on a localhost 3000 this is the home page that I am coding on right now it's just inside of the page.js inside of the root layer of your app directory so after that we can remove the image import at the top and then we are going to create a new route called register so you're just creating a new folder we'll have a file inside of it called page.jsx we can do RFC and then we could type register page the function could be named whatever you want and I use the es7 Snippets which allows me to RFC for a functional component just like this so the next thing I want to do is I want to actually use Tailwinds components like I said so if we go and they do have paid versions and they have free versions as well as tail and CSS we just go to the first search result we go to the components and you could either click templates or you could scroll down and you can look through all of the templates or components and what we're going to do is we are going to use where is the login and register here we go sign in and register so we're going to use these right here and they are just quick and easy so we don't have to code out the UI so that is what we're going to use so I am going to copy over some of the code from that Tailwind template and what I'm going to do is I'm just going to copy all of the jsx okay so we need to mark this page as you use client directive because we are going to use the you stay hook and react so I'm going to import that at the top and that is from react just like that and then we also are going to use the use router hook as well because after we register I want to push them to a specific page and this is from next forward slash navigation just like that and then next we have to Define what we want to get from the user so this is where they're going to type in the information so we could send to a specific API endpoint and then use next auth to actually authenticate against the database and log them in so that is what we're doing so first we could just say cons a router equals use router just like that and then I am going to have a you stay with the data and set data and we want the name which is initial value of empty string email empty string and password empty string just like that so there is our state and then we right below inside of each input if you look for each input inside of the form we need the value to be data because that's the object and then dot name the first one and then on change we're going to have an anonymous function that's going to set the data which is the function to change the data state and it's going to change it to the spread syntax so we're going to keep all of the data the same and then we're just going to change the name property to the e.target.value as you can see right here and then you just go to each input this is the email so you have data.email and then the set data is going to be to the e.target.value the input and then password same thing data.password e.target.value and then there's a register button and when you click the button the form is going to have it on submit that is going to call the register user function which we have to create above the return so we're going to say cons register User it's going to be an asynchronous function first we're going to prevent the default from happening after that we are going to use the fetch request the fetchweb API so we're going to say fetch and then we have to fetch from our API endpoint which we haven't created yet but we can name it and this is going to be inside the API folder forward slash API forward slash register so we have to create that still but what we're going to do is we are going to use a post request because we are going to pass in some data to that endpoint so if we're going to say Methodist posts we are going to pass in the headers that is the application Json we're sending over as Json data next the body we're going to stringify all of that data and that data is technically an object so we need to wrap it in curly braces just like that and then after this right below the Fetch and the response we're going to say cons user info and that is going to await the response.json row so we're going to get that response back store it inside of the user info variable and then if you want you can actually console.log the user info when we get the information back and then what we could do here is we could say router dot push because we initialized the router up there and then we can push this to the login page because after they register we want them to log in okay so this looks good this whole function here except we haven't closed the register user actual function so let's do a curly brace at the end and now everything looks good so now let's actually create these back end endpoint right here for the API forward slash register so create another folder in the API call register and then this page file convention is called route.js and then inside of the register route.js let's import a few things at the top we're going to import B Crypt from bcrypt we're going to also import the prism client because we are going to use some prism methods to actually create a user and then we could also import the next response at the top as well technically if you're using um JavaScript you don't have to have the next response from next sports server you could just use response but if you're using typescript you can use next response if I do this regardless of JavaScript or typescript so let's initialize prism at the top just like that and then like I said this is going to be in a synchronous function that is a post request we are receiving the request and the first thing is we need that information we need the name email and password from the request.json so we're going to say cons body equals awaitrequest dot Json it would be body if you're using node.js but we are using nexgs and that is the syntax and then what we are getting back is we are getting back the name email and password and we're just destructuring it from the body and if we want Let's test this step out now and actually start a server so we're going to console log the body the console should be in the server because this is a server file and since we didn't finish the whole post request and actually in return anything we are going to get an error thrown but I just want to make sure the console is there before we actually continue so we're going to open up low cost 3000 let's see if we have any other errors as well because we haven't checked so I'm going to inspect real quick console no errors so we go to the register page and as you can see is literally copy and paste and you got yourself a nice looking register page so what we could do here is we could type and register this out and we're actually not going to register user we're just going to send stuff back and see if the console actually gets something from the request.json number five register nothing's going to happen so let's minimize this let's look in the console and we actually didn't initialize prism yet so we never actually did MPX prism generate so none of this is going to work so let's stop the terminal npx prism generate that was a step I missed inside the prism okay so now we can do npn run Dev and as you can see it is always good to check and console log everything as you go or you're going to run into problems from the past that you should have sold at that time so we're going to say Brett if I want a Gmail one two three four five register of course we can error that's fine but as you can see here in the console we are actually getting the data back into the server because you see it's Brett Brett wanted Gmail and then password one two three four five that's what I wanted to check to make sure everything was going good let's do a few checks so we're going to say if there is no name no email or no no password we need to return a new next response we have a 400 with the error saying missing name email or password I don't usually like writing like that let me write it like this missing name in or password the status of 400 just like that so right after that if if they pass that check we want to create see if actually the user is in the database so we're going to say cons exist equals a weight we need the prism dot user dot find unique and it's going to be unique where and whatever one's unique inside of our user schema which is the email so we're going to have the email and it's going to be the email that we got from the body up here from the request.json so if we check this email and there is a user right then after that we have to say if it exists we're going to say email already exist so if exists is true which if that variable is true we can return a new next response that says user already exists with the status of 400. after that if they pass that check now we could actually hash the password so before we actually send a user back to your database you do want to Hash the password and hide it you want to be keeping your users information as secure as you can this is going to be the hash function from bcrypt and it's going to take in the password and it's going to take an assault of 10. so just like that and that's going to be the new password inside of hash password so we want to send the hash password back to the database not the password that we get from the body so we're going to do here is we're going to create a user cons user equals awaitrism.user.create and we're having the data object and inside of it we have the name which is just the name we have the email which is just the email and then we have the password which is actually going to be the hash password so you do it like that or you can just write hash password just like that not a big deal and then we are going to close the data object and then we're going to close the create object inside the prism.user.create and then we are done with the logic inside of this backend so we are going to return a next response dot Json of the user so we're just going to return the user just like that so that back end should work and this means we should be able to send a user to our mongodb database so let's test that out so go back to our local 3000 refresh the page and we are going to say prep one Gmail one two three four five it's just going to say register and nothing else should happen because we don't have a login page so it shouldn't push us so we have to actually check the database and check the server logs to make sure everything went good or you can actually just inspect the page go to your network tab and when you log in again you should be able to get a status of 200 but we could check our database to see if everything went through we are going to refresh browse the collection and so far we don't have any things that means we do have an error so if we go back to our server everything looks pretty good let's try to refresh the database again and we still don't have any data so let's go back to our locals three thousand and I'm glad this is happening while I'm recording because this is just the debug method of how you're supposed to debug your application so we're going to go to the network tab so we get a stats of 400 missing name email or password so that's what it's saying we're missing so we are getting stopped at this next response right here because it's as if there's no name no email or password from the body then that means we're not getting it it looks like we're getting the name email and body from the password so the problem must be let's see where is the problem okay the problem is when we have it in the console we are just getting the data object so this should be data.name data.emailandata.password or we could just say it is body dot data just like that and then if you do body.data for the console log you will remove this data object and you're just going to get the name email and password so let's try that again so we refresh the page we say Brett Brett want a Gmail one two three four five register we get 500 error now this time so the 500 error is an internal server error and what we are getting here is we're getting unknown argument of hash password and data dot hash password for the user create input so we are getting an invalid prism.user create and that is because if you go inside the schema.prism inside of the user schema we actually don't have a hash password in here and we are sending it to our backend so we need to have hash password as an optional string right here inside of the users and if you do make a change inside of any Prisma schema file you need to stop your server run npx prism generate and this will just update all of everything inside the prism CLI you can do npn run Dev go to localhost 3000 again and it's going to be the register page and let's try it again let's open up the inspect go to the network tab we fill out the information again register and this time we get a status of 200 and then actually did send us to the login page which it's saying this page cannot be found because we haven't created a login page so we did get a status of 200 if you saw really quick now let's go check our database to make sure we have a user and as you can see we have a user with the name email and a hash password that is hidden in our database so we now have successfully registered a user but now let's work on the login portion so we are going to minimize this we could close these tabs here at the top and let's create a login page inside of the app directory so we're gonna have a login we're going to have a page.jsx and what I'm going to do here is I'm going to literally use the same form on the register page the UI inside the login and we're just going to require them to log in with their email and password not name so I'm going to copy that jsx over again so let me do RFC call this the login page remove everything inside of the jsx paste this here and then let's mark this as a used client because we're using state we're going to use the use State hook and then what we are going to do here we could also import these router hook as well and just remember it's next navigation okay so what we're going to do here is let's define our stay at the top so we're going to say cons router first and then we can just State data and all we're getting is the email and the password and they're going to be empty values initially just like that and then if you go to each input like we did in the register form you have a value which is data.email and then on change looking like the spread syntax and then we'll change the email inside the set data and then same thing for the password and on the form we are having an on submit with a function name called login user so we have to create the login user function it's in a synchronous function we're going to prevent the default and then what we're going to do here is we instead of calling a back-end login we are just going to use the sign in function from next forward slash auth next auth so we're going to import sign in and this is going to be from next auth react just like that right below the E dot prevent default we're going to use the sign in the sign in whatever provider you're using that is the name you have to pass in so if you use Google you have to type Google if you're using credentials you can type credentials and as you can see here here's a huge list all you have to do is type the screen string and it gives you a huge list of all the providers you could use to log in we are going to use the credentials like that and then what we have to do is we have to pass in the data that we want so we're going to use a spread syntax and we're passing in all of the data from this login form and then I'm going to have a redirect a false because I don't want it to redirect I want to do the redirect and I'm just going to say router.push to a dashboard page and then close that login function let's create a new folder called dashboard to have that page already on hand call this page .jsx RFC dashboard page and then it's just going to see a dashboard page for now so now our functionality is working and we don't have to create a backend route for the login the reason why is because all the functionality in that login is going to be called inside of that catch-all route inside of the Callback of the asynchronous authorized callback right here so now we can actually write the logic and check against the database to make sure everything matches make sure the password matches make sure there's an actual user associated with the account and then we can log them in so the very first thing we want to do is we want to check to see if the email and password is valid so we're just going to say if there is no credentials.email and let's have one more right here label and then types email so if we don't the credentials.email or we don't have the credentials.password we can throw a new error or you can return null either one is fine we could leave it like that return null right if they pass that check let's just save this and move this coming over so if they pass that first check and they do type in the email and password in the login page next thing we want to do is we want to check to see if the user exists so if the way we do that is we're going to say cons user and we are going to look inside the database using prism and the unique is the email like so it's going to be the email is going to be the credentials email we are going to close the where and then we're going to close this user variable right here so if the user does exist this is good and this means the code will keep going and then we're going to say if there is no user you can return null and you could just leave it exactly like that so other than that we can close we can close this right here and then after that if the user is found we are going to check to see if the password's Matched so we're going to check to see if the passwords match and we're going to say cons passwords match and we're going to use the compare function with B Crypt because we're going to compare the password they type which is the credentials password to user Dot hash password not password just the hash password so we got to compare the hash password to what they typed and this function allows us to do that from bcrypt so when we do that we are going to say the passwords don't match we have to return null and then after this we could close this function just like we did and then below this we are going to return the user object if everything is valid so we're just going to say return user and then let's just make sure everything is closed just like that and as you can see we have completely filled out the logic inside of the authorized callback function inside the catch-all route so let's just quickly go back over it we're saying if there's no email or password we return null if there is a user we're going to check by using this specific bind unique and if there's no user we're going to return null then we're going to check if the passwords match by using the B Crypt compare and if they do match we are going to return the user and let them log in so what we can do here is we can actually test this out now so we have brett1 at Gmail and the password I use is one two three four five so let's go back to our locals 3000 we go into the login page and what we could do here is we could do Bret one on Gmail and then we should do one two three four five we can see if it's successful and if it is this should push push us to the dashboard so we need a comma after all of the options which I don't have after the adapter so it's a simple mistake right there and it looks like we are on the dashboard page let me just actually to check to see if we're logged in we can go to the dashboard and now I'm going to introduce the use session hook to allow us to check to see if we're logged in or not so we can mark this as a used client and the use session Hook is a used session provider and this is what we're gonna have to use to wrap the whole application which is called the session provider so we could create a folder inside of the route of our project called context and the file called provider.jsx we can do RFC and then we can import at the top is we well first we can mark this as a use client and then we are going to import the session provider from next auth forward slash react and so I'm doing this in a separate file like this because I don't want to do this inside of the layout because if you do inside the layout you're going to Mark the layout as a used client and we don't want to do that so now we are going to take in some children and the session as props and then we are going to wrap everything in a session provider it's going to take in the session as a prop right there and it's wrapping all of the children so we're exporting it as provider so let's import it up here as provider and it's from at context forward slash provider and then we can wrap all of the body with the provider so this allows us now to use the use session hook inside of our application just like that so now we can actually go inside of our dashboard again we can import the use session hook and this is from next auth forward slash react let's initialize it by saying const data and the data we're going to rename it as session and it's the use session hook and then what we can do here is we can console log the session so the console should pull up inside of the client side so let's go to the console it's saying null so let's try to log back in and we're going to error thrown at us um loading chunk app client and error code during hydration something something let's go to localhost see if we still get it so no we don't so let's go to part one or Gmail one two three four five n and as you can see we are getting a session object here with the user put the email of brett1 gmail.com and the name as Brett so we are actually getting the session and we are successfully logged in not using next auth and I want to show you how you can display real quick but then other than that that is how you essentially use the credentials provider and that is a full-blown tutorial on how to do it but if you do want to use the session like saying hi whatever we could have um an H1 this is dashboard and then we could just have a P tag and then we could do hi session question mark dot user dot name and the reason why you type a question mark is because it's optional so like right when a page loads and you're fetching the session object using the U session hook that means you're not going to get it right away like you would if you fetched it on the server so we're going to say hi and then our name so that's what should show up on the dashboard so as you can see it says hi Brett and we're still console logging the session so that is how you use the credentials provider like I said I have other videos of next off tutorials on my channel so I do recommend you checking those out as well if you do have any questions please leave them down in the comments and I will get back to you as soon as I can other than that I hope you like the video so if you do hit that like button and also subscribe for more content just like this
Info
Channel: Brett Westwood - Software Engineer
Views: 34,604
Rating: undefined out of 5
Keywords: next auth, react, next js 13, next auth app dir, next js, next auth credentials, next auth credentials provider, next auth credentials custom page, next auth guide, next auth tutorial, next auth step by step, next auth next js 13, next auth credentials jwt, next auth credentials sign up, next js 13 tutorial, reactjs, web development, next js authentication tutorial, nextjs 13 prisma, next js 13 mongodb, next auth adapter, next auth credentials provider jwt
Id: b3pbgBmEGcU
Channel Id: undefined
Length: 50min 1sec (3001 seconds)
Published: Mon Jul 10 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.