This module provides a webserver, which automatically takes care of certificate handling using the ioBroker certificates.
Install via npm i @iobroker/webserver
.
Use the webserver in your ioBroker adapter as the following:
- TypeScript:
import { WebServer } from '@iobroker/webserver';
const webServer = new WebServer({ app, adapter, secure: true });
// initialize and you can use your server as known
const server = await webServer.init();
- JavaScript:
const { WebServer } = require('@iobroker/webserver');
const webServer = new WebServer({ app, adapter, secure: true });
// initialize and you can use your server as known
const server = await webServer.init();
And so you can use CertificateManager
that is used in the WebServer already:
- TypeScript:
import { CertificateManager } from '@iobroker/webserver';
// Not required for server
const certManager = new CertificateManager({ adapter });
// get all collections
const collections = await certManager.getAllCollections();
- JavaScript:
const { CertificateManager } = require('@iobroker/webserver');
// Not required for server
const certManager = new CertificateManager({ adapter });
// get all collections
const collections = await certManager.getAllCollections();
You can activate the OAuth2 support for the webserver. To do this, add the following code after the server is initialized:
// ... initialization of the webserver
this.webServer.app.use(cookieParser());
this.webServer.app.use(bodyParser.urlencoded({ extended: true }));
this.webServer.app.use(bodyParser.json());
this.webServer.app.use(bodyParser.text());
// Install oauth2 server (Only this line is required)
createOAuth2Server(this, { app: this.webServer.app, secure: this.config.secure, withSession: true });
// Old authentication method
this.webServer.app.use(
session({
secret: this.secret,
saveUninitialized: true,
resave: true,
cookie: { maxAge: (parseInt(this.config.ttl as string, 10) || 3600) * 1000, httpOnly: false }, // default TTL
// @ts-expect-error missing typing
store: this.store!,
}),
);
If you want to completely disable old authentication method, the code should looks like:
// ... initialization of the webserver
this.webServer.app.use(cookieParser());
this.webServer.app.use(bodyParser.urlencoded({ extended: true }));
this.webServer.app.use(bodyParser.json());
this.webServer.app.use(bodyParser.text());
// Install oauth2 server (Only this line is required)
createOAuth2Server(this, { app: this.webServer.app, secure: this.config.secure });
Login with OAuth2 is available under /oauth/token
URL:
POST /oauth/token HTTP/1.1
Host: IP:PORT
Content-Type: application/x-www-form-urlencoded
Data: grant_type=password&username=<user>&password=<password>&client_id=ioBroker&stayloggedin=<false/true>
stayloggedin=true
means that the token will be stored in the browser and will be used for the next requests and is optional.
The answer is like:
{
"access_token": "21f89e3eee32d3af08a71c1cc44ec72e0e3014a9",
"expires_in": 3600,
"refresh_token": "66d35faa5d53ca8242cfe57367210e76b7ffded7",
"refresh_token_expires_in": "600000",
"token_type": "Bearer"
}
Refresh token is available under /oauth/token
URL:
POST /oauth/token HTTP/1.1
Host: IP:PORT
Content-Type: application/x-www-form-urlencoded
Data: grant_type=refresh_token&refresh_token=<REFRESH_TOKEN>&client_id=ioBroker&stayloggedin=<false/true>
The answer is the same as for the login but with new tokens.
- (@GermanBluefox) Added the possibility to give tokens for internal use (like node-red)
- (@GermanBluefox) Added the log output for invalid password in OAuth2
- (@GermanBluefox) A minimal Node.js version is 16 (Not breaking, as no one uses node 14)
- (@GermanBluefox) Updated TypeScript to 5.8
- (@GermanBluefox) Added support for OAuth2 authentication with brute force
- (@GermanBluefox) Updated packages and typing
- (@GermanBluefox) Added access control options for server
- (@GermanBluefox) Used
@iobroker/eslint-config
for linting
- (@GermanBluefox) Extend the security checker with the pattern detection and custom URL
- (@GermanBluefox) Changed the error text of the security checker
- (@GermanBluefox) added the security checker
- (raintonr) Fix contexts for SNICallback (#3).
- (@GermanBluefox) Update packages
- (@GermanBluefox) Corrected small error with CA certificate
- (@GermanBluefox) Added check of the cert files
- (@GermanBluefox) Corrected error with
getCertificatesAsync
- (@GermanBluefox) Added support for user-configured certificates for fallback
- (@GermanBluefox) Rename
Webserver
toWebServer
- (foxriver76) initial release based on ioBroker/ioBroker.js-controller#2104 by @raintonr