TokenService
Class: TokenService<T>
Defined in: packages/core/src/services/token.service.ts:145
Issues access tokens (JWT) and rotating refresh tokens
Webda Modda
TokenService
Extends
Service<T>
Type Parameters
T
T extends TokenServiceParameters = TokenServiceParameters
Constructors
Constructor
new TokenService<
T>(name,params):TokenService<T>
Defined in: packages/core/src/services/service.ts:191
Service
Parameters
name
string
The name of the service
params
T
The parameters block define in the configuration file
Returns
TokenService<T>
Inherited from
Properties
_compiledCapabilities
protected_compiledCapabilities:Record<string,any> ={}
Defined in: packages/core/src/services/iservice.ts:49
Capabilities detected at compile-time from @WebdaCapability-tagged interfaces.
Populated during Service.resolve by reading the service's entry in
webda.module.json. Each key is a capability name (e.g., "request-filter"),
and the value is an empty object {} by default. Override getCapabilities
to provide capability-specific configuration or to conditionally disable capabilities.
See
getCapabilities
Inherited from
[WEBDA_EVENTS]
[WEBDA_EVENTS]:
object
Defined in: packages/core/src/services/service.ts:165
Set the Webda events here
Inherited from
logger
protectedlogger:Logger
Defined in: packages/core/src/services/service.ts:178
Logger with class context
Inherited from
metrics?
protectedoptionalmetrics?:object
Defined in: packages/core/src/services/service.ts:182
Get metrics
Inherited from
name
readonlyname:string
Defined in: packages/core/src/services/iservice.ts:26
Inherited from
parameters
readonlyparameters:T
Defined in: packages/core/src/services/iservice.ts:27
Inherited from
revocationHits
protectedrevocationHits:Map<string, {entry:RevokedAccess;until:number; }>
Defined in: packages/core/src/services/token.service.ts:147
Revoked keys, cached until their expiry (user: entries only for revocationCacheTtl: they can be raised)
revocationMisses
protectedrevocationMisses:Map<string,number>
Defined in: packages/core/src/services/token.service.ts:149
Keys known not revoked, cached for revocationCacheTtl
sweepTimer?
protectedoptionalsweepTimer?:Timeout
Defined in: packages/core/src/services/token.service.ts:151
Periodic sweep of the expired denylist entries
createConfiguration?
staticoptionalcreateConfiguration?: (params) =>any
Defined in: packages/core/src/services/iservice.ts:32
Create configuration set by the application on load
Parameters
params
any
Returns
any
Inherited from
filterConfiguration?
staticoptionalfilterConfiguration?: (params) =>any
Defined in: packages/core/src/services/iservice.ts:37
Create configuration set by the application on load
Parameters
params
any
Returns
any
Inherited from
Parameters
staticParameters: typeofServiceParameters=ServiceParameters
Defined in: packages/core/src/services/service.ts:161
Service parameters
Inherited from
Methods
__clean()
abstract__clean():Promise<void>
Defined in: packages/core/src/services/service.ts:494
Clean the service data, can only be used in test mode
Returns
Promise<void>
Inherited from
addListener()
addListener<
Key>(eventName,listener):this
Defined in: packages/core/src/events/asynceventemitter.ts:83
Type Parameters
Key
Key extends never
Parameters
eventName
Key
the event name
listener
(event) => void | Promise<void>
the event listener
Returns
this
this for chaining
See
EventEmitter.addListener
Inherited from
addRoute()
protectedaddRoute(url,methods,executer,openapi?,override?):void
Defined in: packages/core/src/services/service.ts:386
Add a route dynamicaly
Parameters
url
string
of the route can contains dynamic part like {uuid}
methods
the HTTP methods
executer
Function
Method to execute for this route
openapi?
the OpenAPI specification
override?
boolean = false
whether to override existing
Returns
void
Inherited from
authorizeClientEvent()
authorizeClientEvent(
_event,_context):boolean
Defined in: packages/core/src/services/service.ts:339
Authorize a public event subscription
Parameters
_event
string
the event name
_context
the execution context
Returns
boolean
true if the condition is met
Inherited from
cacheHit()
protectedcacheHit(key,entry):void
Defined in: packages/core/src/services/token.service.ts:316
Cache a revoked entry: a user: notBefore can be raised by a later revocation, so re-read it after the TTL
Parameters
key
string
denylist key
entry
the entry
Returns
void
computeParameters()
computeParameters():
void
Defined in: packages/core/src/services/service.ts:200
Used to compute or derivate input parameter to attribute
Returns
void
Deprecated
Inherited from
denylist()
protecteddenylist(key,notBefore?,accessTtl?):Promise<void>
Defined in: packages/core/src/services/token.service.ts:353
Parameters
key
string
denylist key
notBefore?
number
for user entries, tokens issued before are rejected (ms)
accessTtl?
number = 0
longest lifetime (s) of the access tokens to reject, at least the accessTtl parameter
Returns
Promise<void>
emit()
emit<
Key>(event,data):Promise<void>
Defined in: packages/core/src/services/service.ts:475
Emit the event with data and wait for Promise to finish if listener returned a Promise
Type Parameters
Key
Key extends never
Parameters
event
Key
the event name
data
object[Key]
the data to process
Returns
Promise<void>
Inherited from
getCapabilities()
getCapabilities():
Record<string,any>
Defined in: packages/core/src/services/iservice.ts:77
Return the capabilities of this service.
By default returns capabilities detected at compile-time from
Returns
Record<string, any>
the result
Webda Capability-tagged
interfaces in webda.module.json.
Override to disable capabilities based on configuration:
getCapabilities() {
const caps = super.getCapabilities();
if (!this.parameters.enabled) delete caps["request-filter"];
return caps;
}
Inherited from
getClientEvents()
getClientEvents():
string[]
Defined in: packages/core/src/services/service.ts:327
Return the events that an external system can subscribe to
Returns
string[]
the list of results
Inherited from
getMaxListeners()
getMaxListeners():
number
Defined in: packages/core/src/events/asynceventemitter.ts:90
Returns
number
Inherited from
getMetric()
getMetric<
T>(type,configuration):T
Defined in: packages/core/src/services/service.ts:309
Add service name label
Type Parameters
T
T = Gauge<string> | Counter<string> | Histogram<string>
Parameters
type
CustomConstructor<T, [MetricConfiguration<T>]>
the type to look up
configuration
the configuration
Returns
T
the result
Inherited from
getName()
getName():
string
Defined in: packages/core/src/services/service.ts:485
Get service name
Returns
string
the result string
Inherited from
getOpenApiReplacements()
getOpenApiReplacements():
any
Defined in: packages/core/src/services/service.ts:415
Return variables for replacement in openapi
Returns
any
the result
Inherited from
Service.getOpenApiReplacements
getOperationId()
getOperationId(
id):string
Defined in: packages/core/src/services/service.ts:373
If undefined is returned it cancel the operation registration
Parameters
id
string
the identifier
Returns
string
the result
Inherited from
getParameters()
getParameters():
T
Defined in: packages/core/src/services/service.ts:208
Get the service parameters
Returns
T
the result
Inherited from
getService()
getService<
T>(name):ServicesMap[T]
Defined in: packages/core/src/services/service.ts:299
Get a service by name
Type Parameters
T
T extends keyof ServicesMap
Parameters
name
T
the name to use
Returns
ServicesMap[T]
the result map
Deprecated
Use useService, might reconsider
Inherited from
getState()
getState():
ServiceStates
Defined in: packages/core/src/services/service.ts:171
Get the current state
Returns
the result
Inherited from
getUrl()
getUrl(
url,_methods):string
Defined in: packages/core/src/services/service.ts:350
Return the full path url based on parameters
Parameters
url
string
relative url to service
_methods
in case we need filtering (like Store)
Returns
string
absolute url or undefined if need to skip the Route
Inherited from
hash()
protectedhash(token):string
Defined in: packages/core/src/services/token.service.ts:191
Parameters
token
string
raw refresh token
Returns
string
SHA-256 hex
init()
init():
Promise<TokenService<T>>
Defined in: packages/core/src/services/token.service.ts:169
Purge expired denylist entries now and then periodically
Returns
Promise<TokenService<T>>
Overrides
initMetrics()
initMetrics():
void
Defined in: packages/core/src/services/service.ts:289
Init the metrics
Returns
void
Inherited from
initOperations()
initOperations():
void
Defined in: packages/core/src/services/service.ts:422
Init the operations from
Returns
void
Operation
decorators on this service
Inherited from
isConditionFailure()
protectedisConditionFailure(err):boolean
Defined in: packages/core/src/services/token.service.ts:519
Parameters
err
any
error thrown by a conditional write
Returns
boolean
true if the error is a failed write condition
isRevoked()
isRevoked(
claims):Promise<boolean>
Defined in: packages/core/src/services/token.service.ts:338
Parameters
claims
verified access claims
Returns
Promise<boolean>
true when the family or the user was revoked after the token was issued
issue()
issue(
session,family?,options?):Promise<IssuedTokens&object>
Defined in: packages/core/src/services/token.service.ts:211
Issue an access + refresh token pair for a logged session
Roles are not persisted: refreshed access tokens carry no roles until they are re-derived.
Parameters
session
logged session (must not be anonymous nor pending MFA)
family?
string = ...
existing family when rotating
options?
IssueOptions = {}
OAuth client, scope and display name
Returns
Promise<IssuedTokens & object>
the tokens and their family
listeners()
listeners(
eventName):Function[]
Defined in: packages/core/src/events/asynceventemitter.ts:183
Get all listeners for an event
Parameters
eventName
never
the event name
Returns
Function[]
the list of results
Inherited from
loadCapabilities()
protectedloadCapabilities():void
Defined in: packages/core/src/services/service.ts:269
Load capabilities from webda.module.json metadata into _compiledCapabilities.
Called during resolve after dependency injection. Reads the service's
type name from parameters, looks it up in the application's module metadata
(moddas or beans section), and populates _compiledCapabilities with an
empty object for each declared capability name.
Fails silently if the application is not available (e.g., in unit tests where services are instantiated without a full application context).
Returns
void
Example
// If webda.module.json contains:
// { "moddas": { "MyApp/HawkService": { "capabilities": ["request-filter", "cors-filter"] } } }
// Then after resolve(), this.getCapabilities() returns:
// { "request-filter": {}, "cors-filter": {} }
See
getCapabilities
Inherited from
log()
log(
level, ...args):void
Defined in: packages/core/src/services/service.ts:515
Parameters
level
WorkerLogLevel
to log
args
...any[]
additional arguments
Returns
void
Inherited from
lookupRevoked()
protectedlookupRevoked(key):Promise<RevokedAccess>
Defined in: packages/core/src/services/token.service.ts:294
Parameters
key
string
denylist key
Returns
Promise<RevokedAccess>
the entry, or undefined
newRefreshToken()
protectednewRefreshToken():string
Defined in: packages/core/src/services/token.service.ts:198
Returns
string
a new raw refresh token
off()
off<
Key>(eventName,listener):this
Defined in: packages/core/src/events/asynceventemitter.ts:141
Type Parameters
Key
Key extends never
Parameters
eventName
Key
the event name
listener
(event) => void
the event listener
Returns
this
this for chaining
See
EventEmitter.off
Inherited from
on()
on<
Key>(eventName,listener):this
Defined in: packages/core/src/events/asynceventemitter.ts:119
Type Parameters
Key
Key extends never
Parameters
eventName
Key
the event name
listener
(event) => void
the event listener
Returns
this
this for chaining
See
EventEmitter.once
Inherited from
once()
once<
Key>(eventName,listener):this
Defined in: packages/core/src/events/asynceventemitter.ts:108
Type Parameters
Key
Key extends never
Parameters
eventName
Key
the event name
listener
(event) => void
the event listener
Returns
this
this for chaining
See
EventEmitter.once
Inherited from
pruneRevocationCaches()
protectedpruneRevocationCaches():void
Defined in: packages/core/src/services/token.service.ts:324
Drop the expired cache entries
Returns
void
refresh()
refresh(
refreshToken,options?):Promise<IssuedTokens&object>
Defined in: packages/core/src/services/token.service.ts:396
Exchange a refresh token (rotation with reuse detection)
The token is only ever looked up by its hash, so an access token or any arbitrary string simply does not match a stored record.
Parameters
refreshToken
string
raw refresh token
options?
client the token must belong to and optional narrower scope
clientId?
string
client the token must belong to
resource?
string
resource the token must be bound to: the new tokens keep the stored one
scope?
narrower scope to grant
Returns
Promise<IssuedTokens & object>
new tokens, the rebuilt session and the granted scope
removeAllListeners()
removeAllListeners<
Key>(eventName?):this
Defined in: packages/core/src/events/asynceventemitter.ts:150
Type Parameters
Key
Key extends never
Parameters
eventName?
Key
the event name
Returns
this
this for chaining
See
EventEmitter.removeAllListeners
Inherited from
removeListener()
removeListener<
Key>(eventName,listener):this
Defined in: packages/core/src/events/asynceventemitter.ts:130
Type Parameters
Key
Key extends never
Parameters
eventName
Key
the event name
listener
(event) => void
the event listener
Returns
this
this for chaining
See
EventEmitter.removeListener
Inherited from
resolve()
resolve():
this
Defined in: packages/core/src/services/token.service.ts:159
Enforce the bearer token scope on every operation. The authorizer is never unregistered, even on stop: a scoped bearer must stay restricted while the service drains or reloads (fail closed). It does nothing for sessions without scopes
Returns
this
Overrides
revokeFamily()
revokeFamily(
family):Promise<void>
Defined in: packages/core/src/services/token.service.ts:526
Parameters
family
string
family to revoke
Returns
Promise<void>
revokeUser()
revokeUser(
userId):Promise<void>
Defined in: packages/core/src/services/token.service.ts:539
Parameters
userId
string
user whose tokens are revoked
Returns
Promise<void>
setMaxListeners()
setMaxListeners(
n):this
Defined in: packages/core/src/events/asynceventemitter.ts:97
Parameters
n
number
Returns
this
Inherited from
stop()
stop():
Promise<void>
Defined in: packages/core/src/services/token.service.ts:181
Returns
Promise<void>
Overrides
sweepRevoked()
sweepRevoked():
Promise<number>
Defined in: packages/core/src/services/token.service.ts:374
Returns
Promise<number>
number of removed expired entries
toJSON()
toJSON():
string
Defined in: packages/core/src/services/service.ts:454
Prevent service to be serialized
Returns
string
the result
Inherited from
toString()
toString():
string
Defined in: packages/core/src/services/service.ts:224
Return service representation
Returns
string
the result
Inherited from
unusedSuccessor()
protectedunusedSuccessor(stored,now):Promise<{ok:boolean;record?:RefreshToken; }>
Defined in: packages/core/src/services/token.service.ts:506
Whether a rotated token presented again may be rotated once more: within refreshGrace of its rotation, and
the token it was exchanged for was never used (not rotated, not revoked; a record that was never written, the
issue having failed after the rotation, counts as unused)
Parameters
stored
the rotated token
now
number
ms
Returns
Promise<{ ok: boolean; record?: RefreshToken; }>
ok, with the successor's record to retire when it exists
verifyAccess()
verifyAccess(
token,options?):Promise<AccessClaims>
Defined in: packages/core/src/services/token.service.ts:274
Parameters
token
string
access token
options?
accepted audience(s), defaults to ACCESS_AUDIENCE (tokens bound to no resource)
audience?
string | string[]
accepted audience(s)
Returns
Promise<AccessClaims>
claims, or undefined when invalid/expired