From bf29bf6f5b487bef36ebaab57ba3242cd86b30cf Mon Sep 17 00:00:00 2001 From: Diana Lau Date: Wed, 13 May 2020 22:33:00 -0400 Subject: [PATCH] fix: jwt auth tutorial --- docs/site/imgs/auth-tutorial-apiexplorer.png | Bin 0 -> 64885 bytes docs/site/imgs/auth-tutorial-auth-button.png | Bin 0 -> 53826 bytes docs/site/imgs/auth-tutorial-jwt-token.png | Bin 0 -> 27645 bytes .../authentication/Authentication-Tutorial.md | 1374 ++--------------- 4 files changed, 170 insertions(+), 1204 deletions(-) create mode 100644 docs/site/imgs/auth-tutorial-apiexplorer.png create mode 100644 docs/site/imgs/auth-tutorial-auth-button.png create mode 100644 docs/site/imgs/auth-tutorial-jwt-token.png diff --git a/docs/site/imgs/auth-tutorial-apiexplorer.png b/docs/site/imgs/auth-tutorial-apiexplorer.png new file mode 100644 index 0000000000000000000000000000000000000000..de960eae75c19bba8d09e09540bde82a5ec7b7ba GIT binary patch literal 64885 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�xV0}Y-JFNDdg|y5GBR-4E#2PU*qwT% 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 H#)1C_26?0% literal 0 HcmV?d00001 diff --git a/docs/site/imgs/auth-tutorial-auth-button.png b/docs/site/imgs/auth-tutorial-auth-button.png new file mode 100644 index 0000000000000000000000000000000000000000..a68210f7528aacb59809487ce4070ca8ad5c387b GIT binary patch literal 53826 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

$`G7UIa>DAqmwV>*({Q%yP zkvsU4mIwAFZq6j9l9^?xax*Zfd-Z6CQrd!nfq}!%RAZ!-1!&s_)CR>imtujcOI}ft zfyeupaM`)00~AT!{oZG@b5=d+30HH!$VlA>5cat4;Y7>6>F|NL8BAm<8KDO;NjsBPjvt@X?gFnp9au!S%vG`giB`> zWvS(kSi4DU7~4u&JDadNBzBHK+JxF^Z5->-QN z=>?m40t!<@LqlJoP}9bGFpeI_AHUjpw(fN)D$Y}ss_9#NeEjn#Pc|q~aG;DV>D;wd z@FZTI6tUhGn~=gO^q7{@dQUUhP?$H6SiZT!Vozu7 zinYiZ@ODAbTby0bbB@S{3I>iEJ@!QShKTiy{?+oW$cT&9jd%IFN->&Hk0WMN6O$KL zM0Mf8dNz)+xc?$n!{al{)2b>R%yS#8)xYb1cO5A8Snc z$Iwq*q(}neqju5OajE3au9BXiV-5J~`tOzb3c$F~e=kN9hYY)Rz(urMJ%IBo#!>FC zjt&Sat2_UhHDQIV{-?O^-zxe3_w)Y0TND1f*Z!}I%D=BA|IfYlZ!P%u5C6Ac{o9lO h*=s79SP;r!v6VRQbLGcX?JpNcIVt5=MK6p#{2vRE!OZ{w literal 0 HcmV?d00001 diff --git a/docs/site/imgs/auth-tutorial-jwt-token.png b/docs/site/imgs/auth-tutorial-jwt-token.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3d2dfe17571729b1125b1efd5474887982ea52 GIT binary patch literal 27645 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 { - currentUserProfile.id = currentUserProfile[securityId]; - delete currentUserProfile[securityId]; - return currentUserProfile; - } - - // ... -``` - -{% include note.html content="Since this controller method is obtaining SecurityBindings.USER via [method injection](../../Dependency-injection.md#method-injection) (instead of [constructor injection](../../Dependency-injection.md#constructor-injection)) and this method is decorated with the @authenticate decorator, there is no need to specify @inject(SecurityBindings.USER, {optional:true}). See [Using the Authentication Decorator](../../Loopback-component-authentication.md#using-the-authentication-decorator) for details. -" %} - -The `/users/me` endpoint is decorated with - -```ts -@authenticate('jwt') -``` - -and authentication will only succeed if a valid JWT token is provided in the -`Authorization` header of the request. - -Basically, the -[AuthenticateFn](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/providers/auth-action.provider.ts) -action in the custom sequence `MyAuthenticationSequence` (discussed in a later -section) asks -[AuthenticationStrategyProvider](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/providers/auth-strategy.provider.ts) -to resolve the registered authentication strategy with the name `'jwt'` (which -is `JWTAuthenticationStrategy` and discussed in a later section). Then -`AuthenticateFn` calls `JWTAuthenticationStrategy`'s `authenticate(request)` -function to authenticate the request. - -If the provided JWT token is valid, then `JWTAuthenticationStrategy`'s -`authenticate(request)` function returns the user profile. `AuthenticateFn` then -places the user profile on the request context using the `SecurityBindings.USER` -binding key. The user profile is available to the `printCurrentUser()` -controller function in a variable `currentUserProfile: UserProfile` through -dependency injection via the same `SecurityBindings.USER` binding key. The user -profile is returned in the response. - -If the JWT token is missing/expired/invalid, then `JWTAuthenticationStrategy`'s -`authenticate(request)` function fails and an -[HTTP 401 UnAuthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401) -is thrown. - -If an **unknown** authentication strategy **name** is specified in the -`@authenticate` decorator: - -```ts -@authenticate('unknown') -``` - -then -[AuthenticationStrategyProvider](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/providers/auth-strategy.provider.ts)'s -`findAuthenticationStrategy(name: string)` function cannot find a registered -authentication strategy by that name, and an -[HTTP 401 UnAuthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401) -is thrown. - -So, be sure to specify the correct authentication strategy name when decorating -your endpoints with the `@authenticate` decorator. - -### Creating a Custom Sequence and Adding the Authentication Action - -In a LoopBack 4 application with REST API endpoints, each request passes through -a stateless grouping of actions called a [Sequence](../../Sequence.md). - -Authentication is **not** part of the default sequence of actions, so you must -create a custom sequence and add the authentication action. - -The custom sequence `MyAuthenticationSequence` in -[loopback4-example-shopping/packages/shopping/src/sequence.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/sequence.ts) -implements the -[SequenceHandler](https://github.com/strongloop/loopback-next/blob/master/packages/rest/src/sequence.ts) -interface. - -```ts -export class MyAuthenticationSequence implements SequenceHandler { +// ---------- ADD IMPORTS ------------- +import { + AuthenticateFn, + AuthenticationBindings, + AUTHENTICATION_STRATEGY_NOT_FOUND, + USER_PROFILE_NOT_FOUND, +} from '@loopback/authentication'; +// ------------------------------------ +export class MySequence implements SequenceHandler { constructor( - @inject(SequenceActions.FIND_ROUTE) protected findRoute: FindRoute, - @inject(SequenceActions.PARSE_PARAMS) - protected parseParams: ParseParams, - @inject(SequenceActions.INVOKE_METHOD) protected invoke: InvokeMethod, - @inject(SequenceActions.SEND) protected send: Send, - @inject(SequenceActions.REJECT) protected reject: Reject, + // ---- ADD THIS LINE ------ @inject(AuthenticationBindings.AUTH_ACTION) protected authenticateRequest: AuthenticateFn, ) {} - async handle(context: RequestContext) { try { const {request, response} = context; const route = this.findRoute(request); - - //call authentication action + // - enable jwt auth - + // call authentication action + // ---------- ADD THIS LINE ------------- await this.authenticateRequest(request); - - // Authentication successful, proceed to invoke controller const args = await this.parseParams(request, route); const result = await this.invoke(route, args); this.send(response, result); - } catch (error) { - // - // The authentication action utilizes a strategy resolver to find - // an authentication strategy by name, and then it calls - // strategy.authenticate(request). - // - // The strategy resolver throws a non-http error if it cannot - // resolve the strategy. When the strategy resolver obtains - // a strategy, it calls strategy.authenticate(request) which - // is expected to return a user profile. If the user profile - // is undefined, then it throws a non-http error. - // - // It is necessary to catch these errors and add HTTP-specific status - // code property. - // - // Errors thrown by the strategy implementations already come - // with statusCode set. - // - // In the future, we want to improve `@loopback/rest` to provide - // an extension point allowing `@loopback/authentication` to contribute - // mappings from error codes to HTTP status codes, so that application - // don't have to map codes themselves. + } catch (err) { + // ---------- ADD THIS SNIPPET ------------- + // if error is coming from the JWT authentication extension + // make the statusCode 401 if ( - error.code === AUTHENTICATION_STRATEGY_NOT_FOUND || - error.code === USER_PROFILE_NOT_FOUND + err.code === AUTHENTICATION_STRATEGY_NOT_FOUND || + err.code === USER_PROFILE_NOT_FOUND ) { - Object.assign(error, {statusCode: 401 /* Unauthorized */}); + Object.assign(err, {statusCode: 401 /* Unauthorized */}); } - - this.reject(context, error); - return; + // ---------- END OF SNIPPET ------------- + this.reject(context, err); } } } ``` -The authentication action/function is injected via the -`AuthenticationBindings.AUTH_ACTION` binding key, is given the name -`authenticateRequest` and has the type -[AuthenticateFn](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/types.ts). - -Calling - -```ts -await this.authenticateRequest(request); -``` - -before - -```ts -// ... -const result = await this.invoke(route, args); -this.send(response, result); -// ... -``` - -ensures that authentication has succeeded before a controller endpoint is -reached. +## Step 3: Create the UserController for login -To add the custom sequence `MyAuthenticationSequence` in the application, we -must code the following in -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts): +In the UserController, we are going to create three endpoints: -```ts -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); +- `/login` for users to provide credential to login +- `/whoami` for showing who is the current user +- `/signup` for users to sign up - // ... - - // Set up the custom sequence - this.sequence(MyAuthenticationSequence); - - // ... - } -} -``` +### 3a. Create the UserController -### Creating a Custom JWT Authentication Strategy +Create the controller using `lb4 controller` command with the empty controller +option. -When creating a custom authentication strategy, it is necessary to implement the -[AuthenticationStrategy](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/types.ts) -interface. - -A custom JWT authentication strategy `JWTAuthenticationStrategy` in -[loopback4-example-shopping/packages/shopping/src/authentication-strategies/jwt-strategy.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/authentication-strategies/jwt-strategy.ts) -was implemented as follows: - -```ts -import {inject} from '@loopback/context'; -import {HttpErrors, Request} from '@loopback/rest'; -import {AuthenticationStrategy, TokenService} from '@loopback/authentication'; -import {UserProfile} from '@loopback/security'; - -import {TokenServiceBindings} from '../keys'; - -export class JWTAuthenticationStrategy implements AuthenticationStrategy { - name: string = 'jwt'; - - constructor( - @inject(TokenServiceBindings.TOKEN_SERVICE) - public tokenService: TokenService, - ) {} - - async authenticate(request: Request): Promise { - const token: string = this.extractCredentials(request); - const userProfile: UserProfile = await this.tokenService.verifyToken(token); - return userProfile; - } - - extractCredentials(request: Request): string { - if (!request.headers.authorization) { - throw new HttpErrors.Unauthorized(`Authorization header not found.`); - } - - // for example: Bearer xxx.yyy.zzz - const authHeaderValue = request.headers.authorization; +```sh +$ lb4 controller +? Controller class name: User +Controller User will be created in src/controllers/user.controller.ts - if (!authHeaderValue.startsWith('Bearer')) { - throw new HttpErrors.Unauthorized( - `Authorization header is not of type 'Bearer'.`, - ); - } +? What kind of controller would you like to generate? Empty Controller - //split the string into 2 parts: 'Bearer ' and the `xxx.yyy.zzz` - const parts = authHeaderValue.split(' '); - if (parts.length !== 2) - throw new HttpErrors.Unauthorized( - `Authorization header value has too many parts. It must follow the pattern: 'Bearer xx.yy.zz' where xx.yy.zz is a valid JWT token.`, - ); - const token = parts[1]; +create src/controllers/user.controller.ts + update src/controllers/index.ts - return token; - } -} +Controller User was created in src/controllers/ ``` -It has a **name** `'jwt'`, and it implements the -`async authenticate(request: Request): Promise` -function. - -An extra function `extractCredentials(request: Request): string` was added to -extract the JWT token from the request. This authentication strategy expects -every request to pass a valid JWT token in the `Authorization` header. - -`JWTAuthenticationStrategy` also makes use of a token service `tokenService` of -type `TokenService` that is injected via the -`TokenServiceBindings.TOKEN_SERVICE` binding key. It is used to verify the -validity of the JWT token and return a user profile. - -This token service is explained in a later section. +### 3b. Add endpoints in UserController -### Registering the Custom JWT Authentication Strategy +For UserService which verifies the credentials, we are going to use the default +implementation in the `@loopback/authentication-jwt` extension. Therefore, the +constructor injects the `MyUserService` from this extension. -To register the custom authentication strategy `JWTAuthenticationStrategy` with -the **name** `'jwt'` as a part of the authentication framework, we need to code -the following in -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts). +{% include code-caption.html content="/src/controllers/user.controller.ts" %} ```ts -import {registerAuthenticationStrategy} from '@loopback/authentication'; - -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); - // ... - registerAuthenticationStrategy(this, JWTAuthenticationStrategy); - // ... - } -} -``` - -### Creating a Token Service - -The token service `JWTService` in -[loopback4-example-shopping/packages/shopping/src/services/jwt-service.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/services/jwt-service.ts) -implements an **optional** helper -[TokenService](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/services/token.service.ts) -interface. - -```ts -import {inject} from '@loopback/context'; -import {HttpErrors} from '@loopback/rest'; -import {promisify} from 'util'; +// ---------- ADD IMPORTS ------------- +import {inject} from '@loopback/core'; +import { + TokenServiceBindings, + MyUserService, + UserServiceBindings, + UserRepository, +} from '@loopback/authentication-jwt'; import {TokenService} from '@loopback/authentication'; -import {UserProfile} from '@loopback/security'; -import {TokenServiceBindings} from '../keys'; - -const jwt = require('jsonwebtoken'); -const signAsync = promisify(jwt.sign); -const verifyAsync = promisify(jwt.verify); - -export class JWTService implements TokenService { - constructor( - @inject(TokenServiceBindings.TOKEN_SECRET) - private jwtSecret: string, - @inject(TokenServiceBindings.TOKEN_EXPIRES_IN) - private jwtExpiresIn: string, - ) {} - - async verifyToken(token: string): Promise { - if (!token) { - throw new HttpErrors.Unauthorized( - `Error verifying token: 'token' is null`, - ); - } - - let userProfile: UserProfile; - - try { - // decode user profile from token - const decryptedToken = await verifyAsync(token, this.jwtSecret); - // don't copy over token field 'iat' and 'exp', nor 'email' to user profile - userProfile = Object.assign( - {id: '', name: ''}, - {id: decryptedToken.id, name: decryptedToken.name}, - ); - } catch (error) { - throw new HttpErrors.Unauthorized( - `Error verifying token: ${error.message}`, - ); - } - - return userProfile; - } - - async generateToken(userProfile: UserProfile): Promise { - if (!userProfile) { - throw new HttpErrors.Unauthorized( - 'Error generating token: userProfile is null', - ); - } - - // Generate a JSON Web Token - let token: string; - try { - token = await signAsync(userProfile, this.jwtSecret, { - expiresIn: Number(this.jwtExpiresIn), - }); - } catch (error) { - throw new HttpErrors.Unauthorized(`Error encoding token: ${error}`); - } - - return token; - } -} -``` - -`JWTService` generates or verifies JWT tokens using the `sign` and `verify` -functions of [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken). - -It makes use of `jwtSecret` and `jwtExpiresIn` **string** values that are -injected via the `TokenServiceBindings.TOKEN_SECRET` and the -`TokenServiceBindings.TOKEN_EXPIRES_IN` binding keys respectively. - -The `async generateToken(userProfile: UserProfile): Promise` function -takes in a user profile of type -[UserProfile](https://github.com/strongloop/loopback-next/blob/master/packages/security/src/types.ts), -generates a JWT token of type `string` using: the **user profile** as the -payload, **jwtSecret** and **jwtExpiresIn**. - -The `async verifyToken(token: string): Promise` function takes in a -JWT token of type `string`, verifies the JWT token, and returns the payload of -the token which is a user profile of type `UserProfile`. - -To bind the JWT `secret`, `expires in` values and the `JWTService` class to -binding keys, we need to code the following in -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts): - -```ts -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); +import {SecurityBindings, UserProfile} from '@loopback/security'; +import {repository} from '@loopback/repository'; +// ---------------------------------- - // ... - this.setUpBindings(); - // ... - } - - setUpBindings(): void { - // ... - - this.bind(TokenServiceBindings.TOKEN_SECRET).to( - TokenServiceConstants.TOKEN_SECRET_VALUE, - ); - - this.bind(TokenServiceBindings.TOKEN_EXPIRES_IN).to( - TokenServiceConstants.TOKEN_EXPIRES_IN_VALUE, - ); - - this.bind(TokenServiceBindings.TOKEN_SERVICE).toClass(JWTService); - - // ... - } -} -``` - -In the code above, `TOKEN_SECRET_VALUE` has a value of `'myjwts3cr3t'` and -`TOKEN_EXPIRES_IN_VALUE` has a value of `'600'`. - -`JWTService` is used in two places within the application: -`JWTAuthenticationStrategy` in -[loopback4-example-shopping/packages/shopping/src/authentication-strategies/jwt-strategy.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/authentication-strategies/jwt-strategy.ts), -and `UserController` in -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts). - -### Creating a User Service - -The user service `MyUserService` in -[loopback4-example-shopping/packages/shopping/src/services/user-service.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/services/user-service.ts) -implements an **optional** helper -[UserService](https://github.com/strongloop/loopback-next/blob/master/packages/authentication/src/services/user.service.ts) -interface. - -```ts -export class MyUserService implements UserService { - constructor( - @repository(UserRepository) public userRepository: UserRepository, - @inject(PasswordHasherBindings.PASSWORD_HASHER) - public passwordHasher: PasswordHasher, - ) {} - - async verifyCredentials(credentials: Credentials): Promise { - const foundUser = await this.userRepository.findOne({ - where: {email: credentials.email}, - }); - - if (!foundUser) { - throw new HttpErrors.NotFound( - `User with email ${credentials.email} not found.`, - ); - } - const passwordMatched = await this.passwordHasher.comparePassword( - credentials.password, - foundUser.password, - ); - - if (!passwordMatched) { - throw new HttpErrors.Unauthorized('The credentials are not correct.'); - } - - return foundUser; - } - - convertToUserProfile(user: User): UserProfile { - // since first name and lastName are optional, no error is thrown if not provided - let userName = ''; - if (user.firstName) userName = `${user.firstName}`; - if (user.lastName) - userName = user.firstName - ? `${userName} ${user.lastName}` - : `${user.lastName}`; - return {id: user.id, name: userName}; - } -} -``` - -The `async verifyCredentials(credentials: Credentials): Promise` function -takes in a credentials of type -[Credentials](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/repositories/user.repository.ts), -and returns a **user** of type -[User](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/models/user.model.ts). -It searches through an injected user repository of type `UserRepository`. - -The `convertToUserProfile(user: User): UserProfile` function takes in a **user** -of type `User` and returns a user profile of type -[UserProfile](https://github.com/strongloop/loopback-next/blob/master/packages/security/src/types.ts). -A user profile, in this case, is the minimum set of user properties which -identify an authenticated user. - -`MyUserService` is used in by `UserController` in -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts). - -To bind the `MyUserService` class, and the password hashing utility it uses, to -binding keys, we need to code the following in -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts): - -```ts -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); - - // ... - - this.setUpBindings(); - - // ... - } - - setUpBindings(): void { - // ... - - // Bind bcrypt hash services - utilized by 'UserController' and 'MyUserService' - this.bind(PasswordHasherBindings.ROUNDS).to(10); - this.bind(PasswordHasherBindings.PASSWORD_HASHER).toClass(BcryptHasher); - - this.bind(UserServiceBindings.USER_SERVICE).toClass(MyUserService); - - // ... - } -} -``` - -### Adding Users - -In the `UserController` class in the -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts), -users can be added by performing a `POST` request to the `/users` endpoint which -is handled by the `create()` function. - -Because user credentials like password are stored outside of the main user -profile, we need to create a new model (a -[Data Transfer Object](https://en.wikipedia.org/wiki/Data_transfer_object)) to -describe data required to create a new user. The class inherits from `User` -model to include all user profile properties, and adds a new property `password` -allowing clients to specify the password too. - -```ts -@model() -export class NewUserRequest extends User { - @property({ - type: 'string', - required: true, - }) - password: string; -} -``` - -The controller method `UserController.create` then has to remove additional -properties like `password` before passing the data to Repository (and database). - -```ts -export class UserController { - constructor( - // ... - @repository(UserRepository) public userRepository: UserRepository, - @inject(PasswordHasherBindings.PASSWORD_HASHER) - public passwordHasher: PasswordHasher, +constructor( @inject(TokenServiceBindings.TOKEN_SERVICE) public jwtService: TokenService, @inject(UserServiceBindings.USER_SERVICE) - public userService: UserService, + public userService: MyUserService, + @inject(SecurityBindings.USER, {optional: true}) + public user: UserProfile, + @repository(UserRepository) protected userRepository: UserRepository, ) {} - - // ... - - @post('/users') - async create( - @requestBody({ - content: { - 'application/json': { - schema: getModelSchemaRef(NewUserRequest, { - title: 'NewUser', - }), - }, - }, - }) - newUserRequest: NewUserRequest, - ): Promise { - // ensure a valid email value and password value - validateCredentials(_.pick(newUserRequest, ['email', 'password'])); - - // encrypt the password - const password = await this.passwordHasher.hashPassword( - newUserRequest.password, - ); - - // create the new user - const savedUser = await this.userRepository.create( - _.omit(newUserRequest, 'password'), - ); - - // set the password - await this.userRepository - .userCredentials(savedUser.id) - .create({password}); - - return savedUser; - } - - // ... ``` -A user of type -[User](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/models/user.model.ts) -is added to the database via the user repository if the user's email and -password values are in an acceptable format. +For the implementation of all the 3 endpoints, you can take a look at this +[user.controller.ts](https://github.com/strongloop/loopback-next/blob/master/examples/todo-jwt/src/controllers/user.controller.ts) +in the [`todo-jwt` example]. -### Issuing a JWT Token on Successful Login +## Step 4: Protect the Todo APIs -In the `UserController` class in the -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts), -a user can `log in` by performing a `POST` request, containing an `email` and -`password`, to the `/users/login` endpoint which is handled by the `login()` -function. +Finally, we need to protect other endpoints that we have, i.e. the `/todos` +APIs. Go to `src/controllers/todo.controller.ts`. Simple add +`@authenticate('jwt')` before the `TodoController` class. This will protect all +the APIs in this controller. -```ts -export class UserController { - constructor( - // ... - @repository(UserRepository) public userRepository: UserRepository, - @inject(PasswordHasherBindings.PASSWORD_HASHER) - public passwordHasher: PasswordHasher, - @inject(TokenServiceBindings.TOKEN_SERVICE) - public jwtService: TokenService, - @inject(UserServiceBindings.USER_SERVICE) - public userService: UserService, - ) {} - - // ... - - @post('/users/login', { - responses: { - '200': { - description: 'Token', - content: { - 'application/json': { - schema: { - type: 'object', - properties: { - token: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - }) - async login( - @requestBody(CredentialsRequestBody) credentials: Credentials, - ): Promise<{token: string}> { - // ensure the user exists, and the password is correct - const user = await this.userService.verifyCredentials(credentials); - - // convert a User object into a UserProfile object (reduced set of properties) - const userProfile = this.userService.convertToUserProfile(user); - - // create a JSON Web Token based on the user profile - const token = await this.jwtService.generateToken(userProfile); - - return {token}; - } -} -``` - -The user service returns a user object when the email and password are verified -as valid; otherwise it throws an -[HTTP 401 UnAuthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401). -The user service is then called to create a slimmer user profile from the user -object. Then this user profile is used as the payload of the JWT token created -by the token service. The token is returned in the response. - -### Specifying the Security Settings in the OpenAPI Specification - -In the shopping cart application, only one endpoint, `GET /users/me` is secured -with a custom JWT authentication strategy. In order to be able to `set` and -`use` a JWT token in the `API Explorer` (as opposed to using a REST API client), -it is necessary to specify -[security scheme object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#security-scheme-object) -and -[security requirement object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#securityRequirementObject) -information in the application's OpenAPI specification. - -In -[loopback4-example-shopping/packages/shopping/src/utils/security-spec.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/utils/security-spec.ts) -we defined the following: +{% include code-caption.html content="/src/controllers/user.controller.ts" %} ```ts -import {SecuritySchemeObject, ReferenceObject} from '@loopback/openapi-v3'; - -export const OPERATION_SECURITY_SPEC = [{bearerAuth: []}]; -export type SecuritySchemeObjects = { - [securityScheme: string]: SecuritySchemeObject | ReferenceObject; -}; -export const SECURITY_SCHEME_SPEC: SecuritySchemeObjects = { - bearerAuth: { - type: 'http', - scheme: 'bearer', - bearerFormat: 'JWT', - }, -}; -``` - -`SECURITY_SCHEME_SPEC` is a map of security scheme object definitions that are -defined globally for the application. For our purposes, it only contains a -single security scheme object that contains the -[bearerAuth](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#jwt-bearer-sample) -definition. - -`OPERATION_SECURITY_SPEC` is an **operation-level** -[security requirement object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#securityRequirementObject) -that references the `bearerAuth` security scheme object definition. It is used -by the `/users/me` endpoint in -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts). - -Notice the line - -``` -security: OPERATION_SECURITY_SPEC, -``` - -in the code below: - -```ts -@get('/users/me', { - security: OPERATION_SECURITY_SPEC, - responses: { - '200': { - description: 'The current user profile', - content: { - 'application/json': { - schema: UserProfileSchema, - }, - }, - }, - }, -}) -@authenticate('jwt') -async printCurrentUser( - @inject(SecurityBindings.USER) - currentUserProfile: UserProfile, -): Promise { - currentUserProfile.id = currentUserProfile[securityId]; - delete currentUserProfile[securityId]; - return currentUserProfile; +// ---------- ADD IMPORTS ------------- +import {authenticate} from '@loopback/authentication'; +// ------------------------------------ +@authenticate('jwt') // <---- Apply the @authenticate decorator at the class level +export class TodoController { + //... } ``` -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts) -contributes the `security scheme object` definitions to the OpenAPI -specification in the following manner: - -```ts -import {SECURITY_SCHEME_SPEC} from './utils/security-spec'; +If there are particular API that you want to make it available to everyone +without authentication, you can add `@authenticate.skip()` before that function. +See https://loopback.io/doc/en/lb4/Decorators_authenticate.html for more +details. -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); - - this.api({ - openapi: '3.0.0', - info: {title: pkg.name, version: pkg.version}, - paths: {}, - components: {securitySchemes: SECURITY_SCHEME_SPEC}, - servers: [{url: '/'}], - }); -// ... -``` - -Later, when you visit -[http://[::1]:3000/openapi.json](http://[::1]:3000/openapi.json) while the -application is running, search for the text `bearerAuth`. You should find these -two occurrences: - -```json -"components": { - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - }, -``` - -and - -```json -"/users/me": { - "get": { - "x-controller-name": "UserController", - "x-operation-name": "printCurrentUser", - "tags": [ - "UserController" - ], - "security": [ - { - "bearerAuth": [] - } - ], -``` - -Later, when you visit [http://[::1]:3000/explorer/](http://[::1]:3000/explorer/) -while the application is running, you should see an `Authorize` button at the -top. - -![](../../imgs/api_explorer_authorize_button.png) - -as well as a **lock** icon on the `GET /users/me` endpoint in the -`UserController` section - -![](../../imgs/api_explorer_usercontroller_section1.png) - -### How to Specify A Single OpenAPI Specification Security Requirement Object For All Endpoints - -Currently, the `loopback4-example-shopping` application does not implement this, -but there is a way to specify the same OpenAPI specification security -requirement object to **all** endpoints of your application. - -The security scheme object definition is still defined in `components` section, -but the `security` property value is set at the **top** level instead of the -**operation** level. - -```json -"components": { - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT" - } - }, - // ... -}, -"security": [ - { - "bearerAuth": [] - } - ] -``` - -To accomplish this, we only need to make some minor changes to the code examples -provided earlier. - -In -[loopback4-example-shopping/packages/shopping/src/utils/security-spec.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/utils/security-spec.ts), -we simply rename `OPERATION_SECURITY_SPEC` to `SECURITY_SPEC`. - -```ts -import {SecuritySchemeObject, ReferenceObject} from '@loopback/openapi-v3'; - -export const SECURITY_SPEC = [{bearerAuth: []}]; -export type SecuritySchemeObjects = { - [securityScheme: string]: SecuritySchemeObject | ReferenceObject; -}; -export const SECURITY_SCHEME_SPEC: SecuritySchemeObjects = { - bearerAuth: { - type: 'http', - scheme: 'bearer', - bearerFormat: 'JWT', - }, -}; -``` - -In -[loopback4-example-shopping/packages/shopping/src/controllers/user.controller.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/controllers/user.controller.ts), -we remove the line: - -``` -security: SECURITY_SPEC_OPERATION, -``` - -from the `/users/me` endpoint: - -```ts -@get('/users/me', { - responses: { - '200': { - description: 'The current user profile', - content: { - 'application/json': { - schema: UserProfileSchema, - }, - }, - }, - }, -}) -@authenticate('jwt') -async printCurrentUser( - @inject(SecurityBindings.USER) - currentUserProfile: UserProfile, -): Promise { - currentUserProfile.id = currentUserProfile[securityId]; - delete currentUserProfile[securityId]; - return currentUserProfile; -} -``` - -In -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts), -we simply add the line - -``` -security: SECURITY_SPEC -``` - -to the call to `this.api({...})`. This basically means the security requirement -object definition, `bearerAuth`, will be applied to all endpoints. - -```ts -import {SECURITY_SCHEME_SPEC, SECURITY_SPEC} from './utils/security-spec'; - -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); - - this.api({ - openapi: '3.0.0', - info: {title: pkg.name, version: pkg.version}, - paths: {}, - components: {securitySchemes: SECURITY_SCHEME_SPEC}, - servers: [{url: '/'}], - security: SECURITY_SPEC - }); -// ... -``` - -Visiting [http://[::1]:3000/explorer/](http://[::1]:3000/explorer/) while the -application is running, you should still see an `Authorize` button at the top as -before. - -![](../../imgs/api_explorer_authorize_button.png) - -But now, **all** the endpoints have the lock icon. - -![](../../imgs/api_explorer_all_sections_lock_icons1.png) - -This means that you can set the JWT token once via the -`Authorize button/dialog`, and the token will be available to all the endpoints -your interact with. - -There are plans to allow contributions to the OpenAPI specification via an -extensionPoint/extensions pattern ( -[Issue #3854](https://github.com/strongloop/loopback-next/issues/3854) ); -including having authentication strategies automatically contribute security -scheme/requirement object information ( -[Issue #3669](https://github.com/strongloop/loopback-next/issues/3669) ). - -### Summary - -We've gone through the steps that were used to add JWT `authentication` to the -`loopback4-example-shopping` application, and add -`security scheme/requirement object` settings to its OpenAPI specification. - -The final `ShoppingApplication` class in -[loopback4-example-shopping/packages/shopping/src/application.ts](https://github.com/strongloop/loopback4-example-shopping/blob/master/packages/shopping/src/application.ts) -should look like this: - -```ts -import {BootMixin} from '@loopback/boot'; -import {ApplicationConfig, BindingKey} from '@loopback/core'; -import {RepositoryMixin} from '@loopback/repository'; -import {RestApplication} from '@loopback/rest'; -import {ServiceMixin} from '@loopback/service-proxy'; -import {MyAuthenticationSequence} from './sequence'; -import { - RestExplorerBindings, - RestExplorerComponent, -} from '@loopback/rest-explorer'; -import { - TokenServiceBindings, - UserServiceBindings, - TokenServiceConstants, -} from './keys'; -import {JWTService} from './services/jwt-service'; -import {MyUserService} from './services/user-service'; - -import path from 'path'; -import { - AuthenticationComponent, - registerAuthenticationStrategy, -} from '@loopback/authentication'; -import {PasswordHasherBindings} from './keys'; -import {BcryptHasher} from './services/hash.password.bcryptjs'; -import {JWTAuthenticationStrategy} from './authentication-strategies/jwt-strategy'; -import {SECURITY_SCHEME_SPEC} from './utils/security-spec'; - -/** - * Information from package.json - */ -export interface PackageInfo { - name: string; - version: string; - description: string; -} -export const PackageKey = BindingKey.create('application.package'); - -const pkg: PackageInfo = require('../package.json'); - -export class ShoppingApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options?: ApplicationConfig) { - super(options); - - this.api({ - openapi: '3.0.0', - info: {title: pkg.name, version: pkg.version}, - paths: {}, - components: {securitySchemes: SECURITY_SCHEME_SPEC}, - servers: [{url: '/'}], - }); - - this.setUpBindings(); - - // Bind authentication component related elements - this.component(AuthenticationComponent); - - registerAuthenticationStrategy(this, JWTAuthenticationStrategy); - - // Set up the custom sequence - this.sequence(MyAuthenticationSequence); - - // Set up default home page - this.static('/', path.join(__dirname, '../public')); - - // Customize @loopback/rest-explorer configuration here - this.configure(RestExplorerBindings.COMPONENT).to({ - path: '/explorer', - }); - this.component(RestExplorerComponent); - - this.projectRoot = __dirname; - // Customize @loopback/boot Booter Conventions here - this.bootOptions = { - controllers: { - // Customize ControllerBooter Conventions here - dirs: ['controllers'], - extensions: ['.controller.js'], - nested: true, - }, - }; - } - - setUpBindings(): void { - // Bind package.json to the application context - this.bind(PackageKey).to(pkg); +## Try it out - this.bind(TokenServiceBindings.TOKEN_SECRET).to( - TokenServiceConstants.TOKEN_SECRET_VALUE, - ); +Start the application by running npm start and go to +http://localhost:3000/explorer. You’ll see the 3 new endpoints under +`UserController` together with the other endpoints under `TodoController`. - this.bind(TokenServiceBindings.TOKEN_EXPIRES_IN).to( - TokenServiceConstants.TOKEN_EXPIRES_IN_VALUE, - ); +![](../../imgs/auth-tutorial-apiexplorer.png) - this.bind(TokenServiceBindings.TOKEN_SERVICE).toClass(JWTService); +1. Sign up using the `/signup` API - // // Bind bcrypt hash services - this.bind(PasswordHasherBindings.ROUNDS).to(10); - this.bind(PasswordHasherBindings.PASSWORD_HASHER).toClass(BcryptHasher); + Since we don’t have any users created, click on `POST /signup`. For the + requestBody, the minimum you need is `email` and `password`. i.e. - this.bind(UserServiceBindings.USER_SERVICE).toClass(MyUserService); - } -} -``` + ```json + { + "email": "testuser2@abc.com", + "password": "testuser2" + } + ``` -## Running the Completed Application +2. Log in using the `POST /users/login` API -To run the completed application, follow the instructions in the -[Try it out](#try-it-out) section. + After calling `/users/login`, the response body will look something like: -For more information, please visit -[Authentication Component](../../Loopback-component-authentication.md). + ```json + { + "token": "aaaaaaaaa.aaaaaaaaaaaaaaaaa" + } + ``` -## Bugs/Feedback + Copy the token. Go to the top of the API Explorer, click the “Authorize” + button. -Open an issue in -[loopback4-example-shopping](https://github.com/strongloop/loopback4-example-shopping) -and we'll take a look! + ![API Explorer with Authorize Button](../../imgs/auth-tutorial-auth-button.png) -## Contributions + Paste the token that you previously copied to the “Value” field and then + click Authorize. -- [Guidelines](https://github.com/strongloop/loopback-next/blob/master/docs/CONTRIBUTING.md) -- [Join the team](https://github.com/strongloop/loopback-next/issues/110) + ![authorize dialog](../../imgs/auth-tutorial-jwt-token.png) -## Tests + In the future API calls, this token will be added to the `Authorization` + header . -Run `npm test` from the root folder. +3. Get all todos using `GET /todos` API You should be able to call this API + successfully. -## Contributors +## Conclusion -See -[all contributors](https://github.com/strongloop/loopback-next/graphs/contributors). +Congratulations! You have successfully added the JWT authentication to the +LoopBack application! We did the following: -## License +- bind the JWT Component in the Application +- add Authenticate Action in the sequence +- create the UserController for login and signup functions +- protect the APIs by adding the `@authenticate` decorator -MIT +See the +[todo-jwt example](https://github.com/strongloop/loopback-next/blob/master/examples/todo-jwt) +for the working application. You can also run `lb4 example todo-jwt` to download +the example.