Auth
October 31, 2025 ยท View on GitHub
Table of Contents
- General info
- Configure Auth
- Auth via Apple
- Auth via Facebook
- Auth via Google
- Auth via Twitter
- About JWT strategy
- Refresh token flow
- Logout
General info
Auth via email flow
By default we used sign in and sign up via email and password.
sequenceDiagram
participant A as Fronted App (Web, Mobile, Desktop)
participant B as Backend App
A->>B: 1. Sign up via email and password
A->>B: 2. Sign in via email and password
B->>A: 3. Get a JWT token
A->>B: 4. Make any requests using a JWT token
https://user-images.githubusercontent.com/6001723/224566194-1c1f4e98-5691-4703-b30e-92f99ec5d929.mp4
Auth via external services or social networks flow
Also you can sign up via another external services or social networks like Apple, Facebook, Google, and Twitter.
sequenceDiagram
participant B as External Auth Services (Apple, Google, etc)
participant A as Fronted App (Web, Mobile, Desktop)
participant C as Backend App
A->>B: 1. Sign in through an external service
B->>A: 2. Get Access Token
A->>C: 3. Send Access Token to auth endpoint
C->>A: 4. Get a JWT token
A->>C: 5. Make any requests using a JWT token
For auth with external services or social networks you need:
-
Sign in through an external service and get access token(s).
-
Call one of endpoints with access token received in frontend app on 1-st step and get JWT token from the backend app.
POST /api/v1/auth/facebook/login POST /api/v1/auth/google/login POST /api/v1/auth/twitter/login POST /api/v1/auth/apple/login -
Make any requests using a JWT token
Configure Auth
-
Generate secret keys for
access tokenandrefresh token:node -e "console.log('\nAUTH_JWT_SECRET=' + require('crypto').randomBytes(256).toString('base64') + '\n\nAUTH_REFRESH_SECRET=' + require('crypto').randomBytes(256).toString('base64') + '\n\nAUTH_FORGOT_SECRET=' + require('crypto').randomBytes(256).toString('base64') + '\n\nAUTH_CONFIRM_EMAIL_SECRET=' + require('crypto').randomBytes(256).toString('base64'));" -
Go to
/.envand replaceAUTH_JWT_SECRETandAUTH_REFRESH_SECRETwith output from step 1.AUTH_JWT_SECRET=HERE_SECRET_KEY_FROM_STEP_1 AUTH_REFRESH_SECRET=HERE_SECRET_KEY_FROM_STEP_1
Auth via Apple
-
Change
APPLE_APP_AUDIENCEin.envAPPLE_APP_AUDIENCE=["com.company", "com.company.web"]
Auth via Facebook
-
Go to https://developers.facebook.com/apps/creation/ and create a new app
-
Go to
Settings->Basicand getApp IDandApp Secretfrom your app -
Change
FACEBOOK_APP_IDandFACEBOOK_APP_SECRETin.envFACEBOOK_APP_ID=123 FACEBOOK_APP_SECRET=abc
Auth via Google
-
You need a
CLIENT_ID,CLIENT_SECRET. You can find these pieces of information by going to the Developer Console, clicking your project (if doesn't have create it here https://console.cloud.google.com/projectcreate) ->APIs & services->credentials. -
Change
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRETin.envGOOGLE_CLIENT_ID=abc GOOGLE_CLIENT_SECRET=abc
Auth via Twitter
-
Set up your service on Twitter
-
Change
TWITTER_CONSUMER_KEYandTWITTER_CONSUMER_SECRETin.envTWITTER_CONSUMER_KEY=abc TWITTER_CONSUMER_SECRET=abc
About JWT strategy
In the validate method of the src/auth/strategies/jwt.strategy.ts file, you can see that we do not check if the user exists in the database because it is redundant, it may lose the benefits of the JWT approach and can affect the application performance.
To better understand how JWT works, watch the video explanation https://www.youtube.com/watch?v=Y2H3DXDeS3Q and read this article https://jwt.io/introduction/
// src/auth/strategies/jwt.strategy.ts
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
// ...
public validate(payload) {
if (!payload.id) {
throw new UnauthorizedException();
}
return payload;
}
}
If you need to get full user information, get it in services.
Refresh token flow
- On sign in (
POST /api/v1/auth/email/login) you will receivetoken,tokenExpiresandrefreshTokenin response. - On each regular request you need to send
tokeninAuthorizationheader. - If
tokenis expired (check withtokenExpiresproperty on client app) you need to sendrefreshTokentoPOST /api/v1/auth/refreshinAuthorizationheader to refreshtoken. You will receive newtoken,tokenExpiresandrefreshTokenin response.
Video example
https://github.com/brocoders/nestjs-boilerplate/assets/6001723/f6fdcc89-5ec6-472b-a6fc-d24178ad1bbb
Logout
-
Call following endpoint:
POST /api/v1/auth/logout -
Remove
access tokenandrefresh tokenfrom your client app (cookies, localStorage, etc).
Previous: Access Management
Next: Exceptions