Authentication
Overview
Odi provides build in Authentication
module based on JWT. Module is fully configurable and extendable. Also, Authentication
is integrated with Controllers.
Controller example
Getting started
JWT module must be installed
Install npm package
npm install jsonwebtoken --save
Authentication
Auth Service should be created, to start working with authentication in Odi application. Odi automatically extracts token from request and starts processing.
Service
Implementation must be provided for abstract class CoreAuth
with 2 generics.
Only 2 methods must be implemented
serialize(user: User)
- will be called whenuser.assign(...)
called.deserialize(decoding: Decoding)
- will be called, whenuser.load()
called.
Controller Integration
To have fully typed code, you should pass your Auth Service to first Controller generic.
For interacting with user in Controller
, UserData
instance will be passed to user
property. It has only the few methods.
load(options?: DecodeOptions)
- this method decode token and pass it todeserialize(...)
method. Semantically, it should be used to load user from database.decode(options?: DecodeOptions)
- wrapper for JWT decode. DecodesObject
from tokenverify(options?: VerifyOptions)
- wrapper for JWT verify. Decodes and verofyObject
from token. Method returns
[ Decoding | null, Error | null ]
assign(user: User, options?: SignOptions)
- this method encode the token and return it (as string). Custom options can be passed for encoding.user
will be passed toserialize(...)
Guards
@Auth(options?: any)
decorator can be used for protecting routes by permissions or other restrictions.
authenticate
method in AuthService
class must be overridden.
We can create an alias for @Auth(options?: any)
decorator that will be used for guarding routes. options
argument will be passed to authenticate
method.
Now, simply decorate route handler of controller with a newly created decorator.
As a result, only that has "admin"
role can access this endpoint. Otherwise, 403
status code will be send.
Decorator
There is only one decorator @Auth(options?: any)
. As mentioned above, options
argument will be passed to authenticate
method.
This decorator can be applied to the method or whole controller.
Authenticator
Guard implementation must be provided in authenticate
method of AuthService
class.
This method has 3 arguments:
context
- request and response.data
- user data (the same asuser
field in controller).options
- object passed in dectorator.
As you can see, authenticate
method return type is a Promise<boolean>
, so asynchronous calls are allowed (Example: database request).
But there are only 2 return values are possible - true
and false
. If the result is true
, handler will process the request, otherwise 403
status code will be send immediately without further processing
Last updated