https://github.com/jscheffner/hapi-auth-any
Hapi.js plugin to combine multiple different authentication strategies. It passes if one of them does.
https://github.com/jscheffner/hapi-auth-any
authentication hapijs javascript
Last synced: 9 months ago
JSON representation
Hapi.js plugin to combine multiple different authentication strategies. It passes if one of them does.
- Host: GitHub
- URL: https://github.com/jscheffner/hapi-auth-any
- Owner: jscheffner
- License: isc
- Created: 2019-07-24T19:28:55.000Z (almost 7 years ago)
- Default Branch: main
- Last Pushed: 2025-09-22T15:40:12.000Z (9 months ago)
- Last Synced: 2025-09-22T17:45:17.640Z (9 months ago)
- Topics: authentication, hapijs, javascript
- Language: JavaScript
- Homepage:
- Size: 56.6 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# hapi-auth-any
**hapi-auth-any** is a plugin for [hapi.js](https://hapijs.com/) which lets you combine multiple different authentication strategies. It passes if one of them does. Hapi already supports this out-of-the-box, but only if all of those strategies are based on different schemes. With *hapi-auth-any* you can combine various strategies that are based on the same scheme.
**Only the credentials of the strategy that passes first are returned.**
## Plugin Options
The plugin only accepts a single option at the moment. `strategies` is an array containing the names of the strategies to combine. Those names are the first argument passed to `server.auth.strategy` when registering the strategy.
## Usage
For complete examples, have a look at the *examples* folder.
#### 1. Install
Install the plugin with `npm install hapi-auth-any`.
#### 2. Import
Import `hapi-auth-any` and the plugins you need for the authentication strategies that you want to combine (in this example only `@hapi/basic`).
```js
const authAny = require('hapi-auth-any')
const basic = require('@hapi/basic')
```
Then, create a Hapi server:
```js
const hapi = require('@hapi/hapi')
const server = hapi.server({ port: 8080 })
```
#### 3. Register
Now, register the plugins
```js
await server.register([
anyAuth,
basic
])
````
Register the authentication strategies you want to combine.
```js
server.auth.strategy('foo', 'basic', {...})
server.auth.strategy('bar', 'basic', {...})
```
Finally, register the `hapi-auth-any` strategy and pass the names of the strategies it should combine as its `strategies` option. You can set the strategy as the default strategy so it's used for all routes or set it per route.
```js
server.auth.strategy('any', 'any', {
strategies: ['foo', 'bar']
})
server.auth.default('any')
```
## Debugging
Sometimes, the messages exposed to the end users are not enough to find the root of a problem, specifically if a strategy fails because of a server-side error.
To access the complete errors, including their stack, you can register an event listener:
```js
server.events.on({ name: 'request', channels: 'internal' }, (request, event, tags) => {
if (tags.auth && tags.error) {
console.log(event.error)
}
})
```
In this, debugging `hapi-auth-any` isn't different from debugging other strategies. However, in order to preserve the errors that caused `hapi-auth-any` to fail, it throws an [AggregateError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError), decorated with some [boom](https://github.com/hapijs/boom)-specific properties.