{"_id":"@actionlogementservices/aurelia-plugin-oidc","_rev":"3-2061bb5926974850c29e10a81122a7d8","name":"@actionlogementservices/aurelia-plugin-oidc","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@actionlogementservices/aurelia-plugin-oidc","version":"1.0.0","keywords":["aurelia","plugin","openid","oidc","oauth2"],"author":{"name":"KisssDev"},"license":"MIT","_id":"@actionlogementservices/aurelia-plugin-oidc@1.0.0","maintainers":[{"name":"kisssdev","email":"vincent.caritey@outlook.fr"}],"homepage":"https://github.com/actionlogementservices/aurelia-plugin-oidc#readme","bugs":{"url":"https://github.com/actionlogementservices/aurelia-plugin-oidc/issues"},"dist":{"shasum":"367a7307e9b91002d5c1bb47d27318c605b458d5","tarball":"https://registry.npmjs.org/@actionlogementservices/aurelia-plugin-oidc/-/aurelia-plugin-oidc-1.0.0.tgz","fileCount":44,"integrity":"sha512-tUdUt21NHYSj17GhLyyvTJP8c1RvO0w968sXSgF/jPeShcqT7iheMhDLdkkhDHG6vM71Tjj0YNIPSxnV4xug4Q==","signatures":[{"sig":"MEUCIF6YRl3+zkHerVCXjANP2U1keEp2i9L+fdY6nmpJF363AiEAk4ugm3exeFzemRGMbZkgFHqeEkcMZhKdzawJHUZjI54=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":137476},"jest":{"testMatch":["<rootDir>/test/**/*.spec.js"],"transform":{"^.+\\.js$":"babel-jest","^.+\\.(css|less|sass|scss|styl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$":"jest-transform-stub"},"setupFiles":["<rootDir>/test/jest-pretest.js"],"modulePaths":["<rootDir>/src","<rootDir>/node_modules"],"collectCoverage":true,"testEnvironment":"node","moduleNameMapper":{"^aurelia-binding$":"<rootDir>/node_modules/aurelia-binding"},"coverageDirectory":"<rootDir>/test/coverage-jest","coverageReporters":["json","lcov","text","html"],"collectCoverageFrom":["src/**/*.js","!**/*.spec.js","!**/node_modules/**","!**/test/**"],"moduleFileExtensions":["js","json"]},"main":"dist/commonjs/index.js","types":"dist/types","module":"dist/native-modules/index.js","engines":{"node":">=18.0.0"},"gitHead":"a9ddc240317b17f194fe654e35ecb7fac3351e1c","scripts":{"doc":"jsdoc -c ./.jsdoc.json","test":"au test","build":"au build-plugin --env prod","watch":"au build-plugin --watch","prepare":"npm run build && npx tsc -p ts-d-generation.json && cpx src/types.d.ts dist/types","pretest":"au lint","release":"release-it","upgrade":"npx npm-upgrade","preversion":"au test","update:browserslist":"browserslist --update-db"},"_npmUser":{"name":"kisssdev","email":"vincent.caritey@outlook.fr"},"overrides":{"chokidar":"^3.0.0","micromatch":"^4.0.0","glob-parent":"^6.0.0","glob-stream":"^7.0.0"},"repository":{"url":"git+https://github.com/actionlogementservices/aurelia-plugin-oidc.git","type":"git"},"_npmVersion":"10.7.0","description":"An aurelia plugin repository that provides open-id integration.","directories":{},"_nodeVersion":"18.20.3","browserslist":[">= 0.2% in FR, last 5 versions, not dead, not Firefox 12"],"dependencies":{"oidc-client-ts":"^3.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","gulp":"^5.0.0","jest":"^29.7.0","open":"^8.4.2","text":"github:requirejs/text","jsdoc":"^4.0.4","eslint":"^9.17.0","connect":"^3.7.0","globals":"^15.14.0","gulp-if":"^3.0.0","debounce":"^2.2.0","jest-cli":"^29.7.0","prettier":"^3.4.2","minimatch":"^10.0.1","requirejs":"^2.3.7","socket.io":"^4.8.1","@eslint/js":"^9.17.0","babel-jest":"^29.7.0","gulp-babel":"^8.0.0","gulp-cache":"^1.1.3","gulp-watch":"^5.0.1","release-it":"^17.11.0","@babel/core":"^7.26.0","@types/jest":"^29.5.14","aurelia-cli":"^3.0.4","gulp-rename":"^2.0.0","gulp-plumber":"^1.2.1","serve-static":"^1.16.2","server-destroy":"^1.0.1","@babel/register":"^7.25.9","aurelia-testing":"^1.1.0","gulp-eslint-new":"^2.4.0","gulp-sourcemaps":"^3.0.0","jsdoc-escape-at":"^1.0.1","connect-injector":"^0.4.4","kis-jsdoc-plugin":"^2.2.0","promise-polyfill":"^8.3.0","@babel/preset-env":"^7.26.0","aurelia-pal-nodejs":"^3.0.0-rc.2","eslint-plugin-jest":"^28.10.0","eslint-plugin-jsdoc":"^50.6.1","jest-transform-stub":"^2.0.0","regenerator-runtime":"^0.14.1","@babel/eslint-parser":"^7.25.9","aurelia-animator-css":"^1.0.4","aurelia-bootstrapper":"^2.4.1","aurelia-loader-nodejs":"^1.1.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^56.0.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","jest-environment-jsdom":"^29.7.0","eslint-plugin-array-func":"^5.0.2","connect-history-api-fallback":"^2.0.0","@babel/plugin-proposal-decorators":"^7.25.9","@babel/plugin-syntax-dynamic-import":"^7.8.3","@babel/plugin-transform-class-properties":"^7.25.9","@babel/plugin-transform-optional-chaining":"^7.25.9","@babel/plugin-transform-class-static-block":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/aurelia-plugin-oidc_1.0.0_1736465742685_0.4645426417760532","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@actionlogementservices/aurelia-plugin-oidc","version":"1.0.1","keywords":["aurelia","plugin","openid","oidc","oauth2"],"author":{"name":"KisssDev"},"license":"MIT","_id":"@actionlogementservices/aurelia-plugin-oidc@1.0.1","maintainers":[{"name":"kisssdev","email":"vincent.caritey@outlook.fr"}],"homepage":"https://github.com/actionlogementservices/aurelia-plugin-oidc#readme","bugs":{"url":"https://github.com/actionlogementservices/aurelia-plugin-oidc/issues"},"dist":{"shasum":"724c9e4df5286ddfab4a19b5d884fe1c71a2dbfa","tarball":"https://registry.npmjs.org/@actionlogementservices/aurelia-plugin-oidc/-/aurelia-plugin-oidc-1.0.1.tgz","fileCount":44,"integrity":"sha512-lEetrrbg62zyqXhPcYSeeqPkCGdL3iW/JFnR9ollimmrTdPHfIb/cEsGCoBTCHeTZPXExkHnVThKyY5IwEMRPA==","signatures":[{"sig":"MEQCIHjLlf6kGC6ShyZ1uEE961u5k4u+36N3IKqSaZV1yD2SAiAJC6fhXTlK3SYS7K7MollxgVx9NIeO+r4u+l3sI+zx4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136625},"jest":{"testMatch":["<rootDir>/test/**/*.spec.js"],"transform":{"^.+\\.js$":"babel-jest","^.+\\.(css|less|sass|scss|styl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$":"jest-transform-stub"},"setupFiles":["<rootDir>/test/jest-pretest.js"],"modulePaths":["<rootDir>/src","<rootDir>/node_modules"],"collectCoverage":true,"testEnvironment":"node","moduleNameMapper":{"^aurelia-binding$":"<rootDir>/node_modules/aurelia-binding"},"coverageDirectory":"<rootDir>/test/coverage-jest","coverageReporters":["json","lcov","text","html"],"collectCoverageFrom":["src/**/*.js","!**/*.spec.js","!**/node_modules/**","!**/test/**"],"moduleFileExtensions":["js","json"]},"main":"dist/commonjs/index.js","types":"dist/types","module":"dist/native-modules/index.js","engines":{"node":">=18.0.0"},"gitHead":"8ca98c345232f29f75acb44d81a9572e5c652d44","scripts":{"doc":"jsdoc -c ./.jsdoc.json","test":"au test","build":"au build-plugin --env prod","watch":"au build-plugin --watch","prepare":"npm run build && npx tsc -p ts-d-generation.json && cpx src/types.d.ts dist/types","pretest":"au lint","release":"release-it","upgrade":"npx npm-upgrade","preversion":"au test","update:browserslist":"browserslist --update-db"},"_npmUser":{"name":"kisssdev","email":"vincent.caritey@outlook.fr"},"overrides":{"chokidar":"^3.0.0","micromatch":"^4.0.0","glob-parent":"^6.0.0","glob-stream":"^7.0.0"},"repository":{"url":"git+https://github.com/actionlogementservices/aurelia-plugin-oidc.git","type":"git"},"_npmVersion":"10.9.2","description":"An aurelia plugin repository that provides open-id integration.","directories":{},"_nodeVersion":"22.15.0","browserslist":[">= 0.2% in FR, last 5 versions, not dead, not Firefox 12"],"dependencies":{"oidc-client-ts":"^3.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"cpx":"^1.5.0","gulp":"^5.0.0","jest":"^29.7.0","open":"^8.4.2","text":"github:requirejs/text","jsdoc":"^4.0.4","eslint":"^9.17.0","connect":"^3.7.0","globals":"^15.14.0","gulp-if":"^3.0.0","debounce":"^2.2.0","jest-cli":"^29.7.0","prettier":"^3.4.2","minimatch":"^10.0.1","requirejs":"^2.3.7","socket.io":"^4.8.1","@eslint/js":"^9.17.0","babel-jest":"^29.7.0","gulp-babel":"^8.0.0","gulp-cache":"^1.1.3","gulp-watch":"^5.0.1","release-it":"^17.11.0","@babel/core":"^7.26.0","@types/jest":"^29.5.14","aurelia-cli":"^3.0.4","gulp-rename":"^2.0.0","gulp-plumber":"^1.2.1","serve-static":"^1.16.2","server-destroy":"^1.0.1","@babel/register":"^7.25.9","aurelia-testing":"^1.1.0","gulp-eslint-new":"^2.4.0","gulp-sourcemaps":"^3.0.0","jsdoc-escape-at":"^1.0.1","connect-injector":"^0.4.4","kis-jsdoc-plugin":"^2.2.0","promise-polyfill":"^8.3.0","@babel/preset-env":"^7.26.0","aurelia-pal-nodejs":"^3.0.0-rc.2","eslint-plugin-jest":"^28.10.0","eslint-plugin-jsdoc":"^50.6.1","jest-transform-stub":"^2.0.0","regenerator-runtime":"^0.14.1","@babel/eslint-parser":"^7.25.9","aurelia-animator-css":"^1.0.4","aurelia-bootstrapper":"^2.4.1","aurelia-loader-nodejs":"^1.1.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-unicorn":"^56.0.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","jest-environment-jsdom":"^29.7.0","eslint-plugin-array-func":"^5.0.2","connect-history-api-fallback":"^2.0.0","@babel/plugin-proposal-decorators":"^7.25.9","@babel/plugin-syntax-dynamic-import":"^7.8.3","@babel/plugin-transform-class-properties":"^7.25.9","@babel/plugin-transform-optional-chaining":"^7.25.9","@babel/plugin-transform-class-static-block":"^7.26.0"},"_npmOperationalInternal":{"tmp":"tmp/aurelia-plugin-oidc_1.0.1_1755810747558_0.1234712248367662","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-01-09T23:35:42.565Z","modified":"2025-10-29T12:48:41.799Z","1.0.0":"2025-01-09T23:35:43.370Z","1.0.1":"2025-08-21T21:12:27.882Z"},"bugs":{"url":"https://github.com/actionlogementservices/aurelia-plugin-oidc/issues"},"author":{"name":"KisssDev"},"license":"MIT","homepage":"https://github.com/actionlogementservices/aurelia-plugin-oidc#readme","keywords":["aurelia","plugin","openid","oidc","oauth2"],"repository":{"url":"git+https://github.com/actionlogementservices/aurelia-plugin-oidc.git","type":"git"},"description":"An aurelia plugin repository that provides open-id integration.","maintainers":[{"email":"othman.aissaoui@actionlogement.fr","name":"als.oai"},{"email":"vincent.caritey@outlook.fr","name":"kisssdev"}],"readme":"[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![npm package](https://img.shields.io/npm/v/%40actionlogementservices%2Faurelia-plugin-oidc)](https://www.npmjs.com/package/@actionlogementservices/aurelia-plugin-oidc)\n![Coverage Badge](https://img.shields.io/badge/Coverage-100%25-green.svg)\n\n# @actionlogementservices/aurelia-plugin-oidc\n\nAn Aurelia plugin based on the library [oidc-client-ts](https://github.com/authts/oidc-client-ts) and replacement for the previous and now archived [aurelia-kis-oidc](https://github.com/kisssdev/aurelia-kis-oidc) repository. \n\nIt adapts the **[OpenID Connect Authorization Code flow with PKCE](https://github.com/authts/oidc-client-ts/blob/main/docs/protocols/authorization-code-grant-with-pkce.md)** to the Aurelia router in a 'keep it simple' way. Note that support of **Implicit flow has been dropped** in oidc-client-ts. If you rely on this particular flow you need to keep using the aurelia-kis-oidc plugin. Otherwise see the **[Migration from aurelia-kis-oidc](#Migration-from-aurelia-kis-oidc)** guide to adapt your code.\n\nThe plugin is fully [documented](./doc/toc.md) and fully tested.\n\n\n## Description\n\n- After a successful login to the OpenID provider, the access token is automatically attached to the http client, so that further calls to an OAuth2 protected web api will be authenticated.\n\n- When a web api call is made, the plugin will check the access token validity. If the token has expired, the plugin will try to sign in the user silently in order to get a new access token.\n\n- If the user has a valid browser session to the OpenID provider, a new access token is retrieved, and the web api is called transparently.\n\n- If the silent login is not possible the user is prompted to login to the OpenID provider.\n\n- After the successful login, the user is redirected to his original page.\n\n## Migration from aurelia-kis-oidc\n\n- The configuration of the plugin must be changed from\n\n  ```javascript\n  function configureOpenidPlugin(aurelia) {\n    Log.level = 1;       // define the log level : 4: DEBUG, 3: INFO, 2: WARN, 1: ERROR, 0: NONE\n    Log.logger = logger; // set the logger\n    return {\n      userIdClaimSelector: profile => profile.emails[0],\n      reconnectPrompt: loginFunc =>\n        iziToast.show({\n          title: 'Session expired',\n          message: 'Please reconnect',\n          buttons: [[`<button>Reconnect</button>`, (instance, toast) => loginFunc(), true]]\n        }),\n      userManagerSettings: {\n        // your oidc-client-js configuration\n        ...\n        stateStore: new WebStorageStateStore({\n          store: globalThis.sessionStorage\n        }),\n        userStore: new WebStorageStateStore({\n          store: globalThis.sessionStorage\n        })\n      }\n    }\n  }\n  ```\n\n  to\n\n  ```javascript\n  function configureOpenidPlugin(aurelia) {\n    const logger = LogManager.getLogger('aurelia-plugin-oidc');\n    const pluginConfiguration = new PluginConfiguration({\n      userIdClaimSelector: profile => profile.emails[0],\n      reconnectPrompt: loginFunc =>\n        iziToast.show({\n          title: 'Session expired',\n          message: 'Please reconnect',\n          buttons: [[`<button>Reconnect</button>`, (instance, toast) => loginFunc(), true]]\n        }),\n      userManagerSettings: {\n        // your oidc-client-js configuration\n        ...\n      }\n    });\n    pluginConfiguration\n      .setLogLevel(1)    // define the log level : 4: DEBUG, 3: INFO, 2: WARN, 1: ERROR, 0: NONE\n      .setLogger(logger) // set the logger\n      .setStorage(globalThis.sessionStorage); // set the user and state store of the userManagerSettings\n  }\n  ```\n\n## Features\n\n- This plugin registers dynamically two routes (__signin-oidc__ and __signout-oidc__) within your application in order to implement the OpenID Connect Implicit Client protocol.\n\n- It implements an **http interceptor** that deals with silent login and bearer token.\n\n- It is possible to redirect the application on a specific route based on the presence of a **specific claim** in the user profile (See the __redirectsOnClaim__ configuration property).\n\n- There is a **simulation mode** that connect/disconnect the user without interacting with the OpenID provider (See the __simulation__ and __simulationUser__ configuration properties).\n\n## Installation\n\n1. **Install** the plugin:\n\n    ```node\n    npm install @actionlogementservices/aurelia-plugin-oidc\n    ```\n\n1. **Register** the plugin in aurelia:\n\n    ```javascript\n    // in your main.js or main.ts\n    export function configure(aurelia) {\n      aurelia.use\n        .standardConfiguration()\n        .plugin(PLATFORM.moduleName('@actionlogementservices/aurelia-plugin-oidc'), () => configureOpenidPlugin(aurelia))\n    ```\n\n1. **Configure** the plugin:\n\n    ```javascript\n    function configureOpenidPlugin(aurelia) {\n      const logger = LogManager.getLogger('aurelia-plugin-oidc');\n      const pluginConfiguration = new PluginConfiguration({\n        userIdClaimSelector: profile => profile.emails[0],\n        reconnectPrompt: loginFunc =>\n          iziToast.show({\n            title: 'Session expired',\n            message: 'Please reconnect',\n            buttons: [[`<button>Reconnect</button>`, (instance, toast) => loginFunc(), true]]\n          }),\n        userManagerSettings: {\n          // your oidc-client-js configuration\n          ...\n        }\n      });\n      pluginConfiguration\n        .setLogLevel(1)    // define the log level : 4: DEBUG, 3: INFO, 2: WARN, 1: ERROR, 0: NONE\n        .setLogger(logger) // set the logger\n        .setStorage(globalThis.sessionStorage); // set the user and state store of the userManagerSettings\n    }\n    ```\n\n1. Connect the router and the httpclient with the plugin:\n\n    ```javascript\n    // in your app.js or app.ts\n    import { inject } from 'aurelia-framework';\n    import { HttpClient } from 'aurelia-fetch-client';\n    import { OpenidRouting, Oauth2Interceptor } from '@actionlogementservices/aurelia-plugin-oidc';\n\n    @inject(OpenidRouting, HttpClient, Oauth2Interceptor)\n    export class App {\n\n      constructor(openidRouting, client, authInterceptor) {\n        this.openidRouting = openidRouting;\n        this.configureHttpClient(client, authInterceptor);\n      }\n\n      configureRouter(configuration, router) {\n        ...\n        // required\n        configuration.options.pushState = true;\n        // add dynamically routes for OpenID Connect\n        this.openidRouting.configureRouter(configuration);\n        ...\n      }\n\n      configureHttpClient(client, authInterceptor) {\n        return client.configure(config => {\n          config\n            .withDefaults({\n              headers: {\n                'Access-Control-Allow-Credentials': 'true',\n                'Accept': 'application/json'\n              },\n              credentials: 'include',\n              mode: 'cors'\n            })\n            .rejectErrorResponses()\n            .withInterceptor(authInterceptor)\n        });\n      }\n    ```\n\n## User interface\n\nThis plugin does not come with any user interface element but it provides a [Connection](./doc/src_connection.md) class that encapsulates the OpenID Connect user connection. Just inject the Connection class within your viewmodel and bind your html elements to it.\n\n```javascript\n//login.js\nimport { inject } from 'aurelia-framework';\nimport { Connection } from '@actionlogementservices/aurelia-plugin-oidc';\n\n@inject(Connection)\nexport class Login {\n  constructor(connection) {\n    this.connection = connection;\n  }\n```\n\n```html\n<!-- login.html -->\n<template>\n  <!-- a login button -->\n  <button click.trigger=\"connection.loginUser()\">\n    Login\n  </button>\n  <!-- a conditional lougout link with user name -->\n  <a if.bind=\"connection.isUserLoggedIn\" click.trigger=\"connection.logoutUser()\">\n    Logout ${connection.userId}\n  </a>\n</template>\n```\n\nYou can change the claim that is used to represent the identifier of the user (property userId): see the __userIdClaimSelector__ configuration property.\n\nYou can also change the user prompt interface when the session has expired: see the __reconnectPrompt__ configuration property.\n\n## Configuration options\n\nYou can define specific options in the configuration returned by the __configureOpenidPlugin__ function.\n\n### `userIdClaimSelector`\n\nFunction that defines the profile claim used as user identifier.\n\n_Example:_\n\n ```javascript\n /**\n * Defines the profile claim used as user identifier.\n * @param {Object} profile - the user profile containing claims\n * @return {string} the user identifier\n */\nconst userIdClaimSelector = profile => profile.emails[0];\n ```\n\nIf you do not define this option, the default claim used is the __name__ claim.\n\n### `reconnectPrompt`\n\n_Function that defines the user prompt to reconnect the session when it is expired._\n\nBy default, it displays the native browser prompt.\n\n_Here's an example with the [iziToast](https://github.com/marcelodolza/iziToast) component:_\n\n ```javascript\n/**\n * Implements the reconnect prompt with izitoast component.\n * @param {I18N} i18n -  the translation plugin\n * @return {function} the function called to reconnect the session\n */\nconst reconnectPrompt = loginFunc => {\n  iziToast.show({\n    theme: 'dark',\n    title: 'Session expired!',\n    message: 'Please reconnect...',\n    buttons: [[`<button>Reconnect</button>`, (instance, toast) => loginFunc(), true]]\n  });\n};\n```\n\n### `loginRequiredSelector`\n\nTo determine that the silent login is not possible the OpenID provider will return an error. The plugin must handle the correct error code in order to show the reconnect prompt. The __loginRequiredSelector__ function defines this code analysis.\nThe default function is the following (which is what Microsoft Azure B2C authentication currently returns when silent login is no more available):\n\n```javascript\nerror => error.error === 'interaction_required';\n```\n\nYou can customize it. For instance this is the function I use for an application authenticated by Azure Active Directory (and it should be the same for Azure B2B authentication):\n\n```javascript\nerror => error.error === 'login_required';\n```\n\n### `redirectsOnClaim`\n\nSometimes you want to redirect the router to a specific route after the login when a special claim is present.\n\nFor instance, with __Azure B2C__ there is a special claim when the user has just created his account.\n\nYou can use the __redirectsOnClaim__ function for that.\n\n_Example:_\n\n ```javascript\n /**\n * Defines the redirect route based on specific profile claims.\n * @param {Object} profile - the user profile containing claims\n * @return {string} the route name or undefined\n */\n const redirectsOnClaim = profile => {\n   // redirect newly created users to the settings view\n   if (profile?.newUser) return 'settings';\n };\n ```\n\n### `onError`\n\nSometimes the oicd provider may return an error during the response callback.\n\nYou can use the __onError__ callback to retrieve the error.\n\n_Example:_\n\n ```javascript\n const onError = error => {\n   // for instance for errors returned by Azure AD\n   console.log(error.error_description);\n };\n ```\n\n### `userManagerSettings`\n\nThis object is the exact configuration object of the openid-client-ts library.\n\nSee [oidc-client-ts documentation](https://github.com/authts/oidc-client-ts/blob/main/docs/index.md).\n\nThe __redirect_uri__ must be:\n`https://whatever_your_aurelia_app_url/signin-oidc`\n\nIf you specify __post_logout_redirect_uri__ it should be:\n`https://whatever_your_aurelia_app_url/signout-oidc`\n\n### `simulation`\n\nThis boolean is for __development__ purpose only. It enables to bypass the OpenID provider dialog and to connect virtually the user.\n\nWhen you call the `loginUser` method of the [Connection](doc/src_connection.md) class the user is automatically connected as the default following user:\n\n```javascript\n{\n  profile: { name: 'Test User' },\n  expired: false,\n  access_token: '0123456789'\n}\n```\n\nYou can define your own user object: see the __simulationUser__ configuration property.\n\nWhen you call `logoutUser` of the [Connection](doc/src_connection.md) class the user is automatically disconnected.\n\nOf course as the access token is fake you won't be able to call a protected web api.\n\n### `simulationUser`\n\nThis object enables you to define a custom connected user that should fit your needs.\n\n_Example:_\n\n```javascript\nsimulationUser: {\n      profile: { name: 'J.DOE', emails: ['john.doe@sample.com']},\n      expired: false,\n      access_token: '0123456789'\n    },\n```\n\n## Project documentation\n\nThe project documentation has been generated with jsdoc and the [kis-jsdoc-plugin](https://github.com/kisssdev/kis-jsdoc-plugin).\n\nCheck the [table of content](./doc/toc.md).\n","readmeFilename":"README.md"}