NestJS: Register & Login w/bcrypt & ... | NestJS Auth with JWT & Password Hashing Series 2/4

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hi and welcome back to the second video of an sjs authentication with jwt and password hashing series so let's shortly wrap up what we are doing in this video here so we want to make sure that you can register against the api with like providing the name the email and the password but you can log in against the api by providing an email and a password and of course getting all the users like in the first video that was already working and we will always make sure that every request against our api is being validated um and for this we use validation pipe we will also add bcrypt for password hashing and compare if you log in or try to log in the password hash and we will always return appropriate status codes for example if the email is already um in use so you can't register with it or if you have a wrong password for vlog in and so on and at the end we will check everything with postman and make some example requests important to know is that in this video we are not generating the jwt this will happen in the next video so here we can now go over the structure of the video very shortly so first we will make an overview over the video outcome or look at it then we will read the user story for this video and then we implement the user story and close it so let's have a quick look at the outcome of this video you can see here we have three routes one where we can register or make a post request to register a new user one where we get all the users in the database and one where we can log in and you can see here for repost request if we provide for example an email that is already being used when we get a status code 409 and email already in use if we provide for example no email at all then this validates with a pipe and says the email must be email and since there is no email here the requests will never get to our api so we validate all incoming requests then we have like here where we can get all the users later in the next video we will add awt validation for this so or in the next video series so um that then there is a restricted access to this here but at the moment you can just access it and this is just returning the id name and email properties and not the password property so we are storing the hash the password hash in the database but we are just returning it if we very yeah specify it in our backend code and we are not doing it here and then we can for example log login and this also checks for example if there's an email or a password property and not it says there's no empty password we can for example if we give it false password that's not then it says login was not successful and we can also provide for example email that is not in the database and then we are returning like the error object status code 404 and say that the user has not been found so this is what we will be building in this video here so here you can see that we are still in this nestedjs rpwt project and here you can see our first video or our first story is already set to done so we made this in the last video where we cloned the project we knit everything we connected to the database and so on and now we are here with story 2. where the title is we want to add register and log in route with password hashing so basically the story is as a user or as a developer i want to be able to register against our api so i want to say i'm my name my email and my password and then i want also to log in with this email password combination later against another route from the api so we have some acceptance criteria here so first we want to have new properties for our user so at the moment we are just having name and id but of course we will need to store the email and the password also in our database so we have to update our entity and the interface and we want to also add a user dto and for create and for login and this should be done with the class volley data package so with this we can verify that the requests that are coming in for example with postman they will validate if there is an email property on the invitation and if not then we access to our api isd night and so we can verify that only the stuff that we want or that the requests that are going to our api um are having like or are validated so have the right um stuff in it so we can check if the email actually is an email if the password actually is a string and so on then we want to add the validation pipe to validate all incoming requests and install the class transform package this is needed from s3s and we can just in our main ts file at the validation pipe so that we can validate all incoming requests then we want to add a authentication module for an sjs where we can in this video here add vp or add the password hashing and comparing the hashes for login and later we can also in the next video so in the third video you can already see it here we want to add vray wt generation this would also happen in our authentication module um so we need this and then we also want to add decrypt for password hashing we want to check what is password hashing basically so we have here like a little article that i found that example or explains it very good and then we want to add an authentication service where we can password our hash password and compare passwords so we compare then we for the inroad the password that the user enters with this email and compare the password that he entered against the password where distort or every password hash that is stored in the database venice next we want to rename some functions and end points so to create and log in and we want to return always appropriate status codes for example um for at the moment if we would log in and make a simple um request and we have the right um when it would return 201 created but we want to have of course a 200 um status code so we have to fix this and secondly here or the last thing is we want to register or to test all the routes so just login and getting all the users with postmen at the end so we can now move this here to doing and we can start by implementing reverse stuff so first we said we want to add our properties email and password to our entity and the interface for this we can go into our code and first we have to go to our new branch so at the moment we are on branch develop and like you remember from the last video we merged already the first video stuff into our branch develop so you can see here we have our basic user module which is just here to add a user um which is just having like an id and name and so we work with this so now we can say git flow feature start and we start a new feature branch and we can name this exactly like the story here so this is our second story so now this will create a new feature branch based on the branch develop so you see now we are on petra branch on on our brand feature in s2s after wt2 and it was created based on develop so now we can start and first we can for example start everything just with docker compose and now you see um s3s is available our postgres adminer is available and for example we can check this by running or making requests against our api that we made in the last video and you see we are getting returned we go against api users all using the database at the moment it's just one user we created the last time but we could also create here another user and then you see we have now two users in the database and i could already go here into our petri atminer probably i have to log in again and then i can go to my sqs server the password is the password like you remember that we have here in our docker compose file for postgres for yeah just password so it's a little bit easier so we don't always have to search for it and then we can just make a select all from user entity and then you see now we have here our two users so now we can go on and we can stop this here actually while we are coding and now we can like you remember the first part of our story was we want to have our properties email and password in our entity and in our interface so now we can go to our user we can go into our modules folder and now we have here our id and name and then we want to add our email and the email is of course of type string and this should also be a column and what we also want to add here is we don't want that an email can be used multiple times of course so we set this to true so there can always be just one email so if i would try to register with the same email twice it would make an error because this is it should be unique um the second thing or a property that we need is our password or actually this is the password hash that we saw in the beta database would never store we actual password plain in our database because of security concerns so here we also annotate it with add column and what we want to choose here is you don't want to make it selectable this is like an option that is provided by [Music] typeom and if we set this if we make for example find one or find against our database later against them and query it then if we don't set this here because normally it is set to true [Music] then it would also return always a password hash but actually there are just some times where we working with the password hash and this is either if we are um here the user is changing his password or if the user is um logging in where we need the password hash from the database but normally we often don't need it and so if we want to need it and we just make a fine one then it would not be returned but we can always make in our find one or something we can say okay we want the password property and then we get it so this makes our code a little bit clearer later because then we don't have to exclude always the password property and this is just not selected by default and so this makes it very easier another thing that we want to add is um we want to always store our email as lowercase in our database because if you type it one time with a capital letter or an upper letter and we have a title we just want to have it to always find it so we can annotate this with before insert from typeom and this will be run always before we insert something our user entity or before we store something our database and here we can say that this dot email should always be set to lowercase then we are just having like the email always in lower case you can verify this later then of course we have to make the same changes to our user interface and i named it user i because user interface makes it easier to grab to understand that we are at the moment using the interface later in the code and so we here also need our email and we need the password and we can make the password optional with this so later probably we are not always working with the password property so we can make it optional here so we can mark this actually as done and now we want to create dtos for creating a user and log in with the user and we want to install the package class valley data so for this we can just read to through the nest js documentation for validation and here we can see it is best practice to validate the correctness of any data sent into a web application to automatically validate incoming requests nest provides several pipes available right of the box and so we are using the class validator package so we have to install this first let's give it some time here so we can already install this here and then we can write a read through so we have here some options and what we can use or what we can do is we can just add the validation pipe at our application levels in our main ts file this will ensure that all endpoints are protected from recycling or receiving incorrect data so this is what we want to do so we want to use this here in our main ts file so at first we are setting our global prefix api and we want to use the global pipe center where we want to use the validation pipe from nestle as commons and then if you have it here and we have like our dto here in our endpoint our post endpoint and this will always validate what is coming here in the body um is um well valid for the create user dto so this is what we will do later you can see here these are basically um some dtos that we are also will be using um they are just relating if the email actually is from type email with the classville data package from npm and if the password is not empty for example and there are also some some more stuff so we could go for a class plea data here and you can see there are a bunch of different um annotations for example you can check if the length is correct if it contains something if it is an integer and between something and so on or as it is an email it is a date so you can validate very much here and you see if then for example the email is not an email in the incoming request and this will directly return 400 status code and say that request and say that the email must be an email you could also turn this message here off um by um using some here i don't know actually but we have to yeah and what we also want to do is we want to use the white list because if we set this to true here then the validator will strip [Music] let's check this so here if we use whitelist for example in our global pipes that any property that is not included in the white list is automatically stripped from the resulting object yeah or we can just let it be so now we have this here and i actually found um another project a strange error so if you're just trying to run um nest js with the global pipes here activated with validation pipe then you will actually not just need the class validator package but also the class transform package so we can google for an sqs class trends form error let's see where was the error well whatever we actually really need this or yeah let's just click for the error maybe this helps us to find the actual error message so and now if we're like saying docker compose build this will build our um s3s app again because we made some changes to the code and since our postgres database and the postgreat admin iron image they are not rebuilt but here our code is now rebuilt we are running again npm install and this probably will also connect or make an error in our database because at the moment we are having null values um for example our database for password and email because we did not exist so we have to remove them from our database so we can do this when this was built so just give it some time and now we can start and now you can see we have here an error unable to connect to database because in our user entity table um various email where sometimes it's an island we say here valedictory not denial so we have to connect to our p3 adminer let's see if we are here just login again to our database then we have to delete all and then this should work so let's start up again and now it would work because we are not having any data in our user entity now you see here this is the error the class transformer package is missing so we always need this if we are i'm using this thing here in main ts we use global pipes so if you now search for this error you can see here the class transformer error already opened actually for nest so here it says customers and always will be needed so this should better be or i think should be added here into um documentation but we can just install it and it's all fine so we can install this here and now we can start or go on with coding again and check what is the next step so now we want to add or create our dtos so that we can later validate everything so for this we can make here a new folder that we call dto and then we can say we want to have a login user dot dto dot typescript and we also want to have a create user.dto.typescript in our login user dto we can just say we want to export our class and this is our login user dto and here we are having two properties this is the email from type string and password is also string and now we can add some validation for example we can check if it is an email and for the password we could check for example is not empty so that it always needs a value and in our create user dto we could say we want to export our class create user dto and here we want to have our name and there we want to check that it is a string so that it is a string and we also want to have here not just the name but also the email and password so we can just say here we want to extend our login user dto and then we are having all the properties and we have the property name the property email and password for our create user and this is because if in our endpoint for login we just want to have like the email and the password and for creating the user we want to have the email the password and the username or the name of the user so then we can go in here and we can also mark this as done because we have created both of these dtos and we have already added the validation pipe to in to validate all incoming requests so we can set this to done too and now we want to create our authentication module so we can use here vns3s cli so we can just say nest we say generate or we could also write generate but we can just go with the shortcut with g and say um what do we want to generate a module and here it's the authentication module so health module and then here on the same as user there should be coming the material you can see it here now we have our basic module so we can move set this or mark this as done too then we want to install the clip for password hashing so we can go for npm [Music] decrypt you can see we can just install this here minus one is safe so we save it to our package location um you know this is the library basically to help us to hash passwords and we can see here we can for example use the bcrypt.hash so we can first generate for example a salt and then hazard or we can auto generate basalt and hash at them and here we always have to store we hash in our database password so we mark with this done too and now we want to add our outsource password hashing and comparing so before we do this we can read through this page here which explains a bit about salt and half passwords with decrypt before we implement it in our code so it is very crucial to keep users password secure to protect against cyber attacks the first step is storing password on a secure database server but whatever we do we can never assume that our database cannot be accessed by criminals so we have to solve or hash our passwords and store them within the database so if we have a password we have a plain text password and put it through a hash algorithm the hash algorithm takes in a string of any size and outputs a fixed length string no matter the size of the original string the output is always the same length since the same process always applied the same input always here it's the same output so this is what we need later to check if the password from the login is the same password or we compared then with the hash in the database so we then check if we have the incoming password from the user for vlog in is the same hash as it starts in the database and then we know okay we ended the correct password so you can see it here every time we enter this value here into our hashing algorithm we have the same result sorry we always have the same length for the output wherever we input this on this and here you can see if we only hash the password i can figure out the original password because we always have the same outcome so we need a solid and this is just a random string by hacking a plain text password plus a site the hash algorithm's output is no longer predictable the same password will no longer yield the same hash the salt gets automatically included with the hash so you do not need to store it in a database so on bcrypt okay now we are unsure what to use so bcrypt uses the blowfish cipher one criterion we want our hash algorithm to meter speed you don't want algorithm to run too fast you won't get into a detailed discussion so hashing password is not enough we must also solve the password and b crypt requires you to do so random bytes get added to the password and together the sorted hash meets security recommendations on length and unpredictability another aspect to look as added is longevity versus record bcrypt is widely used and has been around for many years so the algorithm has not been blown up or broken at the moment till now and uh yeah you always have to stay on top because of rewarded bugs and security issues so we can like it says here just usb crypt and we can either if we do it like generate the salt and then hash the password we can also do it like this this will have the same output you see it here this will have the same output as it is here and then the crypt has here like two main functions with one we hash and the others we compare so then we would enter for example the passport from vlog invert the user entered and compare it against the hash redistort in the database and if it matches our hash then we equal to true and if not we equal to false so yeah we can basically do this now in our code to visa just examples let's see if we have anything here if we go over it fast yeah so we can just now start by implementing it so as we remember in our story we have inside decrypt and now we want our authentication servers for password hashing and comparing and add this to our authentication module so we can use venus cli again and say nest generate and this time we don't generate a module by the service and here we can say this lies in our auf module so this will register automatically with service in our authentication module and here we want to go into a new folder that's called services and then we want the service called off and this will automatically add service at the end to it because um here it's a service so you see here when we have the service and this is called off authentication service if you want to spend it longer and now we have it here and in our authentication service you want to do here the two things that we said we need decrypt at first so we already installed it with npm and we can see it here um we have the bin [Music] we have to include our module so we require decrypt and now we can add everything to our authentication service so we want to have two functions and this is as first we want to have a password and second we want to compare passwords the first one takes in as an input parameter our password which is from type string if we want to return an observable which is also a string because um you want to return the hash in this string so now we say we want to return from our vcrypt and where the return type is a string and here we can say let's be crypt dot okay and here we have as our input the password and our solid rounds that you want to go so we could go with 12 and we have to import from from extres so normally be bcrypt i think returns um not an observable button promise and so we can convert it to an uh observable for compare passwords we want to have like um two inputs um and these are this is yeah let's say like um the password that the user entered and this this is also from type string and the second one we have our stored password hash that we get from our database which was originally created here and this returns i think an observable any because bcrypt is not returning there any type probably compare function so here we go again with from and we say decrypt dot compare and here we have to insert the new rv password and we have and this is exactly yeah basically like they did it here where we use bcrypt hash password so this should be all for our authentication service and now you can see it here it's already or added to our providers in our module and now this should be done and so we can check this here in our story so we can now have a password and compare passwords with our authentication service and then next we want to rename our functions endpoints to create and log in and return appropriate status codes for success or for failure so we can go into our user module into our controller and now we can rename this here from create it to create because we want to create a user and then in our user service we have to rename this here also to create and we have to change this here because we are no longer using here interface but we want to use our create user dto so that the incoming request is being validated and then we can rename this here also and as a return we are still returning the user interface and we have to check this here then we have here our find all where we don't change anything this can say it is as it is at the moment in the next video probably video three we can make here some guards that you can only access this is here if you are having a village wt and then we can make here another function or another endpoint for login and actually we have to zoom in i remember so we have here we login we have to annotate this with post and this goes for the route users slash login and normally if you log in then it would return for post requests with status code 201 but since we're not creating anything we could add this to http code and we want to have it returned 200 if everything is okay then for log in we want to get something from the body and this is our login user dto from type login user dto so we validate that there is a valid email and a valid password in our body so here we also want to return an observable and this observable should be of type let's say string at the moment observe the bill and then we want to return our user service dot login and given our login user dto so now we have to implement this stuff here in our user service so first we see is no longer the user interface but the user create user dto and now we have to look what we need to do here so first we can add some let's say helper functions um in our class that we you you'll need probably multiple times so we want for vlog in for example find a user by his email so we can say find user by mail i will name it email i think and so yeah let's load it up so we have it here user entity and it's email so we name it here like the same find user by email and here we want to have provided an email from type string and returned you want to have an observable like a boolean so if this returns true and we have found the user actually i want to return the user interface um so if we find we found the user we want to return the user so we say return from and we again convert the user repository from typom which normally returns not an observable but in promise we return or we transform this promise to an observable so we say return from when we say from our user repository we want to find one and we want to find it by email and here you see it gives us the stuff from our entity as a idea so and this is the same name as here so this is enough and here we can for example say because if we just would make find one then it would not return our user with the password this would not be returned because we made select false so we actually have to specify what that we want also to have a password property returned and this can be done by adding like select and then we what do we want to have returned so for example the id the email you see is giving us everything that we can do the email we name and of course the password because we will need this to um if we make the login stuff to compare the password with the password hash so we have now find user by email this should return observable for our user object and now we can make a second one where we validate the password so we can just say validate password and we take here as input parameter password which is a string and we want to return an observable which should be a boolean so this will just say true or false and will tell us if the password that we provided or that the user entered is correct so here we want to return from or we can say this is not from but we want to use our authentication service where we have our um compare passwords function so what we can do very easily we can use or we can just import the off module into our user module here and to make the service available we have to add here to our exports array and we just say we want to add or export our authentication service also and then we can use it here in our other module so we have now imported our authentication module into our user module here and then we can go into our user service and we can just add our authentication service to our constructor authentication service and then we can use it here so we want then our out service and then we're going to compare the passwords or validate the passwords whatever and you can see it here we want to have the password and restore password hash so we say password and as a second input we will need here the stored password hash which is also a string and this should also be inserted here and then this will return a boolean like here so then we can go into our user service and we add um to check if our mail if the mail already exists and we need this to check because if i register you see that our email is having like our unique true so there can just be one email it cannot be there two times so we always have to check before we create a user if the mail already exists and if it exists then we return like an error status code that the email is already in use or something like this so here we want to have our email which is a string as input and we want to return also an observable from like a boolean type so if we return true when the email already exists and if it returns false then the email is free and the user can register so we say return from and here we can use our user repository you can just use find one and we search by the email and then we can pipe our outcome and map it and say here we get in return from our find one we get a user and if our user is there then we return true so the user exists and if not we return files cannot import it type so let's just edit import map from i think extra s operators yeah so this will return observable with true faults so map takes an observable in and puts the output also an observable so we haven't observed the true or false a boolean so these are just for you see in our class at the moment so we have a private and then we can add our create and login function so we have already our create function here but this needs to be a little bit modified so that it works correctly so the first thing that we want to do is we want to check if the email exists so we can say return from or not from but this dot mail exists and we give him the email that the user provided and then we can pipe the outcome make a simple switch map and say that we get in return exists a boolean and then we can check if it exists or not so we say if it exists so if it or let's say if it not exists so if it's false or anything else then we want to add or do all our logic and if it exists we want to throw like an error so we can say we want to throw like a new http uh i will just call it exception i think and we say let's say email already in use and we can give it a status code so we can say http status and we can say for example conflict http starters.conflict so i think 409 or something like this we have to import the switch map if it exists then we have to return something so for this we could for example say we are using again our service and we want to hash the password because we want to save save we have into our database so we give it here because it expects like the password we say we give it the user.password that we user entered this will have the password so with our outcome we want to do something so we make here like a switch map and this is our let's say the password hash which is a string and then we can do something with it and we can just set our user.password is now the password hash we can for example make comment here overwrite the user password with the hash to store it in the database and then this here still marks red because we are not returning anything so we can say we want now to save this in our database so we say we again use our user repository and we want to save it and here we just give him the user and again like it's normally returning a promise but we make it from to an observable and then this is actually yeah like an error from or something strange i think from a type of m if i i excluded or i made for the entity here we select false and if i make a find one or something like this without specifying the password property then it's not here if i specified it's there but when i save it then i get in return we complete user object with the password property so we have to we cannot just return the save here so we optically get back from here but we have to change it a little bit and here we can just say we get as input like our saved users so map we take the um an observable in which is the user interface and then we have to take an observable out and we simply have to remove the password property from our saved user so we can say const and we strap it away so we say we want to remove the password property and just have the user and then we want to return just the user and so this marks it now because it's the same name as here but this couldn't bother us yeah so i think this should actually do the job so we create still marks as okay now we have to add the login function so we can now delete this comment here so we say login and now we can say we have here our login user dto actually we can rename it here when this goes away so we could say this is our we can use shift 6 to rename it so we say this is our created user dto and then we don't have this here because where isn't it so now let's get away so then we have here all of in user dto and here we also return an observable and this should be just a string at the moment because in this video here we will just compare the password password hash and not add the jwt for the user for authenticate for later this will be happening in third video like we see saw in the beginning so we will just return at the moment string and later we will also return a string for jwt um so we can now say with login we want to first find this user by email so we say find this user by email and we provide this email and then we pipe the outcome and make a little switch map and here we get the found user for example or we can say let's let's name user which is from type user interface and then we do something again with it and this will be we are validating the password and here we can use our function here the lead password remember we need the password as string and we start password hash from the database that we got here by defined user by email so we log in user dto we have the password from the user that he entered for vlogin and in our user we have the password hash from the database so we want to compare now our login user dto dot password against our user dot password so against the password hash that is stored in our database and then we want to pipe the outcome from this here again and map it to an observable so from this in return we get i think it was an boolean value so we can just name this password password passwords mattress so and then check if this is true or false so we can say if password mattress or else we do something and so we say if passwords matches then we want to return like our string login was successful and otherwise we want to throw again an error or http exception so we say http exception and then we can say for example login was not successful and give it a status code and let's say unauthorized and then this should throw an unauthorized error if the passwords are not matching or if something happens here so let's format this a bit this should be fine and now actually i think we can just have a quick look everything should be working and then we can try to start it and make some requests with postman so here we have our http code 200 and all should still be working because we're not doing anything here having our of motion we are exporting our authentication service we are having a password and we are comparing passwords i think this should work let's hope so so let now we can just say double compose build because we made some changes to our code and in this time we can mark this here rename functions and endpoints to create and login and we can fix the status codes to done and now we want to test and register the the register login and users routes with postman so let's give it a little bit time or we can already prepare the requests here so you see this was our last results and if i would hit this now it would or should return that it's missing email or it could not relate email and password because we are using our dtos so just wait a bit so now it has installed i think all dependencies like decrypt and so on that we edit just give it some time and now we can start it and we can check if everything works as we are expecting so now you can see we have here mapped users and we log in route also by api users and register this stuff here is all coming from postgres admin so ignore it at the moment so here we have our user controller api users post requests for slash users where we register one for login and one for getting all the users so if we now hit for example our users then it should return empty array because we deleted all views from the database and if i now want to try to add a user here with this request at work before it should return exactly this because it with the validator package which tries to validate the email with our dto here and checks because this extensively login user dto if the email is an email and if the password is not empty and since it's not here it says it's not working so bad request 400 and we can do this for example with the email and say just the same and then it should say that the email is still not an email and the password should also not be empty you can see it here and just if i make like an invalid email from it then this should work and here for password let's make one after all so now you see email is now valid but it's still not passing the api or the incoming in our controller because password is still empty so for a clustering the password needs to be there let's just say password to make it a little bit easier when you see we get in return our user name email and id we can go into our p3 admin password and then we can validate that there is actually in hash or hash stored in our database and not plain password so we connect to the date server again we open our query and say select all from user entity now you can see here we have our entry and this is my name my email and my password hash you can see it's two things so if i query now the users when i get just returned the one user that's there with id enabled email and i'm not getting return to password because you remember in our entity the password is with select false so when i'm coming into on my user controller if i want to have all and coming in here i'm going to the user service find all and make the repository.find and since we are not specifying like here the password property it will just return all properties that have selected true and since our entity our property password is select false it will not be returned so then we can check our login route so we can go against http localhost 8080 slash api slash users slash login so if we hit it empty nothing here and this is not a get by the post request so if you hit it now you see again there is not a valid email another password provided so we have to add this to the body so we want to add raw json and then we have to add some creation so we say we want to add an email and let's just say to make sure the validation works so this should never be executed so you see the email is actually not an email if i just provide a false email that is not stored in the database at the moment we get an internal server error which is not good where are we user service login find user by email so for example we could say so we are here this is normally closing here so there so we could go and add something here and we can say if user then we want to execute all this stuff and return this and if it's not here we say else pro new http exception and we say user not found status is very not found yeah not found then we have to rebuild everything and let's see if it works let's give it some time and uh yeah at the moment i think actually this should be like like enough so the requests should be working if you verify this would be login and then you can now start it and let's wait it's available so now you see we get the status code 404 user not found and if i get the right email with the user that i registered um but the password was wrong when i get login was not successful so then we are going into this here so passwords are not mattering and if i now provide matching password so we just use password um then i should get successful so now you see i'm just getting returned a string login was successful with 200 status code and this is because we annotated our controller here with status code 200. so this is now all right and we can commit our changes so we can say get at upper a we say git commit with message and here the starting staff of our message is our sql software wt so that we can later find find it in our in the comment history so we can say implemented password hashing and comparing and edit refactored login register routes for the user with returning appropriate status codes and then we can hit enter and commit everything and now you see everything's here committed and then in our next video we want to add for example we log in the jwt validation so you see here at the moment was successful and then we would generate here valetrawt and return this instead of this text here so now we can bring back our changes to our develop branch and here we can just say git flow feature finish and this will merge all our changes from the branch where we are at back into our develop branch so that we can then start with the next story in the next video on the branch develop and merge from their new feature branch so you have seen now we made merge our feature punch back into develop and deleted the branch so we can now check if everything here has been set to done this is correct and we can just move the story here also to done
Info
Channel: Thomas Oliver
Views: 3,991
Rating: 5 out of 5
Keywords: javascript, typescript, nest, nestjs, nest.js, typeorm, git, gitflow, node, development, api, observables, rxjs, nestjs7, bcrypt, jwt, authentication, git-flow, gitFlow, docker, docker-compose, pg-adminer
Id: -8TkSa1MjFM
Channel Id: undefined
Length: 69min 44sec (4184 seconds)
Published: Fri Jan 15 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.