-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
278 lines (220 loc) · 23.3 KB
/
index.html
File metadata and controls
278 lines (220 loc) · 23.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Home - Documentation</title>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
<script src="scripts/nav.js" defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav >
<input type="text" id="nav-search" placeholder="Search" />
<h2><a href="index.html">Home</a></h2><h2><a href="https://github.com/dsorlov/freja" target="_blank" class="menu-item" id="repository" >Github repo</a></h2><h3>Classes</h3><ul><li><a href="module-freja.FrejaAPI.html">FrejaAPI</a><ul class='methods'><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#.GetError">GetError</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#AddOrgIdRequest">AddOrgIdRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#AuthRequest">AuthRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#CancelRequest">CancelRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#CheckCustodianship">CheckCustodianship</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#DeleteCustomIdentifier">DeleteCustomIdentifier</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#GetOrgIdUserList">GetOrgIdUserList</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#InitRequest">InitRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#InquireRequest">InquireRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#NewCustomIdentifier">NewCustomIdentifier</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#RevokeOrgId">RevokeOrgId</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#SignBufferRequest">SignBufferRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#SignRequest">SignRequest</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#UpdateOrgId">UpdateOrgId</a></li><li data-type='method' style='display: none;'><a href="module-freja.FrejaAPI.html#UserInfoFactory">UserInfoFactory</a></li></ul></li></ul><h3>Enums</h3><ul><li><a href="module-freja.html#.FrejaAPIEnvironment">FrejaAPIEnvironment</a></li><li><a href="module-freja.html#.FrejaConfirmationMethod">FrejaConfirmationMethod</a></li><li><a href="module-freja.html#.FrejaDocumentTypes">FrejaDocumentTypes</a></li><li><a href="module-freja.html#.FrejaIdentifierDisplayType">FrejaIdentifierDisplayType</a></li><li><a href="module-freja.html#.FrejaRegistrationLevel">FrejaRegistrationLevel</a></li><li><a href="module-freja.html#.FrejaRequestStatus">FrejaRequestStatus</a></li><li><a href="module-freja.html#.FrejaRequestType">FrejaRequestType</a></li><li><a href="module-freja.html#.FrejaSignatureType">FrejaSignatureType</a></li><li><a href="module-freja.html#.FrejaUserAttributeCollections">FrejaUserAttributeCollections</a></li><li><a href="module-freja.html#.FrejaUserAttributes">FrejaUserAttributes</a></li><li><a href="module-freja.html#~FrejaLOALevel">FrejaLOALevel</a></li><li><a href="module-freja.html#~FrejaRegistrationState">FrejaRegistrationState</a></li></ul><h3>Responses</h3><ul><li><a href="module-freja.html#~ICompletedRequestMessage">ICompletedRequestMessage</a></li><li><a href="module-freja.html#~IFailureResult">IFailureResult</a></li><li><a href="module-freja.html#~IFrejaOrgIdUserList">IFrejaOrgIdUserList</a></li><li><a href="module-freja.html#~IInitializationSuccess">IInitializationSuccess</a></li><li><a href="module-freja.html#~IRequestStatusMessage">IRequestStatusMessage</a></li><li><a href="module-freja.html#~IResultMessage">IResultMessage</a></li><li><a href="module-freja.html#~ISuccessResultMessage">ISuccessResultMessage</a></li><li><a href="module-freja.html#~IUpdateSuccessMessage">IUpdateSuccessMessage</a></li></ul><h3>Freja</h3><ul><li><a href="module-freja.html#.FrejaUserAddressSource">FrejaUserAddressSource</a></li><li><a href="module-freja.html#.FrejaUserAddressType">FrejaUserAddressType</a></li><li><a href="module-freja.html#~IFrejaOrgIdUserInfo">IFrejaOrgIdUserInfo</a></li><li><a href="module-freja.html#~IFrejaResponse">IFrejaResponse</a></li><li><a href="module-freja.html#~IFrejaServiceData">IFrejaServiceData</a></li><li><a href="module-freja.html#~IFrejaSignatureData">IFrejaSignatureData</a></li><li><a href="module-freja.html#~IFrejaSignNotification">IFrejaSignNotification</a></li><li><a href="module-freja.html#~IFrejaUserAddOrganisation">IFrejaUserAddOrganisation</a></li><li><a href="module-freja.html#~IFrejaUserAddress">IFrejaUserAddress</a></li><li><a href="module-freja.html#~IFrejaUserContact">IFrejaUserContact</a></li><li><a href="module-freja.html#~IFrejaUserDetails">IFrejaUserDetails</a></li><li><a href="module-freja.html#~IFrejaUserDocument">IFrejaUserDocument</a></li><li><a href="module-freja.html#~IFrejaUserOrganisation">IFrejaUserOrganisation</a></li><li><a href="module-freja.html#~IFrejaUserOrganisationAttributes">IFrejaUserOrganisationAttributes</a></li><li><a href="module-freja.html#~IFrejaUserOrganisationName">IFrejaUserOrganisationName</a></li></ul><h3>UserInfo</h3><ul><li><a href="module-freja.html#~IEmailUserInfo">IEmailUserInfo</a></li><li><a href="module-freja.html#~IInferredUserInfo">IInferredUserInfo</a></li><li><a href="module-freja.html#~IOrgIdUserInfo">IOrgIdUserInfo</a></li><li><a href="module-freja.html#~IPhoneUserInfo">IPhoneUserInfo</a></li><li><a href="module-freja.html#~ISocialSecurityNumber">ISocialSecurityNumber</a></li><li><a href="module-freja.html#~ISSNUserInfo">ISSNUserInfo</a></li><li><a href="module-freja.html#~IUserInfo">IUserInfo</a></li><li><a href="module-freja.html#~UserInfoType">UserInfoType</a></li></ul>
</nav>
<div id="main">
<section class="package">
<h3> </h3>
</section>
<section class="readme usertext">
<article><div align="center">
<a href="https://github.com/dsorlov/jsfreja/issues/new?assignees=&labels=bug&template=01_BUG_REPORT.md&title=bug%3A+">Report a Bug</a>
·
<a href="https://github.com/dsorlov/jsfreja/issues/new?assignees=&labels=enhancement&template=02_FEATURE_REQUEST.md&title=feat%3A+">Request a Feature</a>
· <a href="https://github.com/dsorlov/jsfreja/discussions">Ask a Question</a>
</div>
<div align="center">
<br />
<p><a href="LICENSE"><img src="https://img.shields.io/github/license/dsorlov/jsfreja.svg?style=flat-square" alt="Project license"></a> <a href="https://github.com/dsorlov/jsfreja/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22"><img src="https://img.shields.io/badge/PRs-welcome-ff69b4.svg?style=flat-square" alt="Pull Requests welcome"></a> <a href="https://github.com/dsorlov"><img src="https://img.shields.io/badge/%3C%2F%3E%20with%20%E2%99%A5%20by-dsorlov-ff1414.svg?style=flat-square" alt="code with love by dsorlov"></a></p>
</div>
<h1>freja</h1>
<h2>About</h2>
<p>This project is created as a simple way of interacting with the <a href="https://frejaeid.atlassian.net/wiki/spaces/DOC/overview">Freja REST API</a> from <a href="https://nodejs.org/en">Node.js</a>. The problem is not that the REST API is hard to use in it self but rather to make a friendlier way to inteact interact and integrate. The <strong>freja</strong> module commes with typings, jsdoc typings, and practical shortcut functions to common functions and actions. You do not have to encode or decode, veryify and keep track of what URIs are used for what. The module does that for you. Kind of like magic.</p>
<p>This module can interact with most parts of Freja.</p>
<ul>
<li>Authentication Service</li>
<li>Signature Service</li>
<li>Organisation ID Service</li>
<li>Custom Identifiers</li>
<li>Custodianship Service</li>
</ul>
<p>The module is created after many years as a part of my <a href="http://github.com/dsorlov/eid-provider">eid</a> moddule, and as many parts of that module were less and less used and the code getting old I decided to branch of into this for just the Freja parts and also raise the bar with more documentation and typings etc. In due time <a href="http://github.com/dsorlov/eid-provider">eid</a> will probably be archived.</p>
<h2>Getting Started</h2>
<p>The module is built as an ES6/CommonJS module. The only external dependency except node itself is <a href="https://github.com/auth0/node-jsonwebtoken">jsonwebtoken</a>. It should be usable on many different enviroments such as Bun but we do not test for that for now.</p>
<h3>Prerequisites</h3>
<p><strong>TL;DR There really is no must-do to get started in the testing enviroment.</strong></p>
<p>To get started you can <a href="https://frejaeid.atlassian.net/wiki/spaces/DOC/pages/34668551/Obtaining+a+Client+TLS+Certificate">obtain your own testing certifiate</a> from Freja but we have also by special arrangement with Freja included one for you already which you may use for testing (it will not work in production). Before going to production you will need a <a href="https://frejaeid.atlassian.net/wiki/spaces/DOC/pages/34701317/Registering+Your+Service+with+Freja">production certificate</a> from Freja to start up your services, which you will get after signing a contract.</p>
<h3>Installation</h3>
<pre class="prettyprint source lang-console"><code>npm install freja
</code></pre>
<h3>Documentation</h3>
<p>This page should give you most hints and the knowledge needed to use the module.
There is also some <a href="/docs/jsdoc">documentation</a> to help you get insights to the objects and more.</p>
<h3>Introduction</h3>
<p>The basic and most used function is <code>initRequest()</code> method however there is some shortcut methods defined such as <code>initAuth()</code>, <code>initSign()</code>, <code>initSignBuffer()</code> and <code>initAddOrganisationId()</code> which all have some good default values set so you dont need to send the arguments to <code>initRequest()</code>.</p>
<p>This is a breif example of an authentication request. The following code is initializing the library with a specified pfx and password. Relative paths are ok. Then we set the minimum requested level using <a href="FrejaAPI#frejafrejaregistrationlevel--enum">FrejaAPI.FrejaRegistrationLevel</a> for the authentication and which attributes to return. Either the <a href="FrejaAPI#frejafrejauserattributecollections--enum">FrejaAPI.FrejaUserAttributeCollections</a> or the <a href="FrejaAPI#frejafrejauserattributes--enum">FrejaAPI.FrejaUserAttributes</a> can be used to assist in getting the right value.</p>
<pre class="prettyprint source lang-javascript"><code>import { FrejaAPIEnvironment, FrejaAPI, FrejaRegistrationLevel, FrejaUserAttributeCollections } from 'freja';
const frejaApi = new FrejaAPI(FrejaAPIEnvironment.TEST,'<path-to-your-pfx>','<pfx-password>');
frejaApi.RegistrationLevel = FrejaRegistrationLevel.PLUS;
frejaApi.UserAttributes = FrejaUserAttributeCollections.ALL_EXTENDED;
</code></pre>
<p>Next let us execute the request. The following code with get us a code to use with a QR-reader or in a mobile app. You can also supply arguments to the initAuthRequest to make sure a specific user is targeted.</p>
<pre class="prettyprint source lang-javascript"><code>let result = await frejaApi.InitAuthRequest();
</code></pre>
<p>All operations we execute returns objects of the <a href="FrejaAPI#frejairesultmessage--object">IResultMessage</a> or one of its derrative classes. They all have a <code>isOk</code> property (boolean). <code>isOk</code> means the operation was successfull.</p>
<p>Next we define a function to check status in the test script. This function will be called every 2.5s as suggested by Freja. We check the response and if its property <code>isFinal</code> (boolean) is true: we have got a final result. Otherwise we just continue pulling here. Also a good expansion of this code could be to also handle fault stats where the <code>isOk</code> flag is false.</p>
<pre class="prettyprint source lang-javascript"><code>let checkResult = await frejaApi.InquireRequest(result.token)
</code></pre>
<p>Errors will have the <code>isOk</code> set to false and <code>code</code> field set to something you can lookup in <a href="FrejaAPI#frejaapigeterrorerrorcode--string">FrejaAPI.GetErrorCode(<number>)</a> if you need a verbose message.</p>
<p>When an authentication request finishes you will get a <a href="FrejaAPI#icompletedrequestmessage--object">ICompletedRequestMessage</a> where the <code>data</code> property will be a <a href="FrejaAPI#ifrejauserinfo--object">IFrejaUserInfo</a> where you will find your requested attributes for the user.</p>
<h3>Autentication Example</h3>
<p>So putting the above together into an simple example for an authentication client.
This will initiate an authentication request, and poll untill we got a result.</p>
<pre class="prettyprint source lang-javascript"><code>// @ts-check
import { FrejaAPIEnvironment, FrejaAPI, FrejaRegistrationLevel, FrejaUserAttributeCollections } from 'freja';
//Setup some API testing stuff
const frejaApi = new FrejaAPI(FrejaAPIEnvironment.PRODUCTION,'<path-to-pfxfile>','<pfxfile-password>');
frejaApi.RegistrationLevel = FrejaRegistrationLevel.PLUS;
frejaApi.UserAttributes = FrejaUserAttributeCollections.ALL_EXTENDED;
// Initiate an authentication request
var result = await frejaApi.AuthRequest('<identifier>');
// Check if the request was successful
if (result.isOk) {
console.log(`Token: ${result.token}`);
} else {
console.error(result);
process.exit(1);
}
async function checkStatus() {
//Get current status of the request
var checkResult = await frejaApi.InquireRequest(result.token);
//The status is not final yet?
if (checkResult.isOk && !checkResult.isFinal) {
setTimeout(checkStatus, 2500);
console.log('Not final yet: ' + checkResult.status);
} else {
console.log('Final status: ' + checkResult.status);
console.log(checkResult);
}
}
//Check status every 2.5 seconds
setTimeout(checkStatus, 2500);
</code></pre>
<h3>Signing Example 1 (Simple)</h3>
<p>The only difference when doing a sign request is basically that you also need to send text and title of the signing. The initSign expects a identifier (because normally you would like to have a specific person sign and not just the first to scan), it could be set to <code>nothing</code> if needed.</p>
<pre class="prettyprint source lang-javascript"><code>var result = await frejaApi.InitSignRequest('<identifier>','title to sign','text to sign');
</code></pre>
<h3>Signing Example 2 (Buffer and OrgId)</h3>
<p>You can also send a hidden piece of information with as proof of the signing. This is done via a Buffer containing the data you need signed. Also in this example we are using the OrgId service (last argument), if you dont need that just remove that parameter.</p>
<pre class="prettyprint source lang-javascript"><code>var result = await frejaApi.InitSignBufferRequest('<identifier>','title to sign','text to sign', <data-in-a-buffer>, true);
</code></pre>
<h3>Adding OrgId</h3>
<p>To issue an OrgId you must send a request for the person to accept the id. To start such a process you can use the</p>
<pre class="prettyprint source lang-javascript"><code>var result = await frejaApi.AddOrgIdRequest('<identifier>','<org-name>','<attribute-name>','<attribute-value>');
</code></pre>
<h3>All methods</h3>
<p>The fundamental methods are</p>
<pre class="prettyprint source lang-javascript"><code>frejaApi.InitRequest(<requestType:RequestType>, <userInfo:IUserInfo|string|undefined>, <additionalParams:Object>);
frejaApi.CancelRequest(<token:string>);
frejaApi.InquireRequest(<token:string>);
</code></pre>
<p>Shortcut methods to make life easier are most commonly used.</p>
<pre class="prettyprint source lang-javascript"><code>frejaApi.AuthRequest(<userInfo:IUserInfo|string|undefined>)
frejaApi.SignRequest(<userInfo:IUserInfo|string|undefined>,<title:string>,<text:string>);
frejaApi.SignBufferRequest(<userInfo:IUserInfo|string|undefined>,<title:string>,<text:string>, <data:Buffer>);
frejaApi.AddOrgIdRequest(<userInfo:IUserInfo|string>,<org-name:string>,<attribute-name:string>,<attribute-value:string>);
</code></pre>
<p>OrgId Specific</p>
<pre class="prettyprint source lang-javascript"><code>frejaApi.UpdateOrgId(<identifier:string>,<additionalAttributeList[]>);
frejaApi.RevokeOrgId(<identifier:string>);
</code></pre>
<p>Not so commonly used functions</p>
<pre class="prettyprint source lang-javascript"><code>frejaApi.CheckCustodianship(<swedishSSN:string>);
frejaApi.NewCustomIdentifier(<customIdentifier:string>,<userInfo:IUserInfo|string>);
frejaApi.DeleteCustomIdentifier(<customIdentifier:string>);
</code></pre>
<h3>additionalParams</h3>
<p>The additionalParams object is used when doing advanced Requests directly via <code>InitRequest()</code> Depending on the type of requests theese can be combined in different ways and a good amount of local validation is done before trying the request.</p>
<p>The most common are (for all types of requests)</p>
<ul>
<li><code>userInfo</code> <strong>{<a href="/FrejaAPI#frejaiuserinfo--object">IUserInfo</a>}</strong> the user info object (see all inherited IUserInfo types in doc)</li>
<li><code>userInfoType</code> <strong>{<a href="/FrejaAPI#frejafrejauserinfotype--enum">FrejaUserInfoType</a>}</strong> the user info object type</li>
<li><code>attributesToReturn</code> <strong>{Array<<a href="/FrejaAPI#frejafrejauserattributes--enum">UserAttributes</a>>}</strong> to return if successfull.</li>
<li><code>userConfirmationMethod</code> <strong>{<a href="/FrejaAPI#frejafrejaconfirmationmethod--enum">FrejaConfirmationMethod</a>}</strong> to use for the request.</li>
<li><code>minRegistrationLevel</code> <strong>{<a href="/FrejaAPI#frejafrejaregistrationlevel--enum">FrejaRegistrationLevel</a>}</strong> the minimum level to use for the request.</li>
</ul>
<p>For requests of signing (both standard and orgid signing)</p>
<ul>
<li><code>waitDays</code> <strong>{Number}</strong> how long the transaction should live. 1-30 days (default is 1 day)</li>
<li><code>text</code> <strong>{String}</strong> The message presented when signing</li>
<li><code>signatureType</code> <strong>{<a href="/FrejaAPI#frejafrejasignaturetype--enum">FrejaSignatureType</a>}</strong> for the signature you wish in the response</li>
<li><code>binaryData</code> <strong>{Buffer}</strong> a buffer with any data to include in the signature</li>
<li><code>notification</code> <strong>{<a href="/FrejaAPI#frejaifrejasignnotification--object">IFrejaSignNotification</a>}</strong> describing the user device notification</li>
</ul>
<p>For adding a orgId (only when adding a new orgid)</p>
<ul>
<li><code>waitDays</code> <strong>{Number}</strong> how long the transaction should live. 1-30 days (default is 1 day)</li>
<li><code>orgId</code> <strong>{<a href="/FrejaAPI#frejaifrejauseraddorganisation--object">IFrejaUserAddOrganisation</a>}</strong> describing the orgId</li>
<li><code>attributes</code> <strong>{<a href="/FrejaAPI#frejaifrejauserorganisationattributes--object">IFrejaAddUserOrganisationAttributes</a>[]}</strong></li>
</ul>
<h2>Roadmap</h2>
<p>See the <a href="https://github.com/dsorlov/jsfreja/issues">open issues</a> for a list of proposed features (and known issues).</p>
<ul>
<li><a href="https://github.com/dsorlov/jsfreja/issues?q=label%3Aenhancement+is%3Aopen+sort%3Areactions-%2B1-desc">Top Feature Requests</a> (Add your votes using the 👍 reaction)</li>
<li><a href="https://github.com/dsorlov/jsfreja/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Areactions-%2B1-desc">Top Bugs</a> (Add your votes using the 👍 reaction)</li>
<li><a href="https://github.com/dsorlov/jsfreja/issues?q=is%3Aopen+is%3Aissue+label%3Abug">Newest Bugs</a></li>
</ul>
<h2>Support</h2>
<p>Reach out to the maintainer at one of the following places:</p>
<ul>
<li><a href="https://github.com/dsorlov/jsfreja/discussions">GitHub Discussions</a></li>
<li>Contact options listed on <a href="https://github.com/dsorlov">this GitHub profile</a></li>
</ul>
<h2>Project assistance</h2>
<p>If you want to say <strong>thank you</strong> or/and support active development of freja:</p>
<ul>
<li>Add a <a href="https://github.com/dsorlov/jsfreja">GitHub Star</a> to the project.</li>
<li>Tweet about freja.</li>
<li>Write interesting articles about the project on <a href="https://dev.to/">Dev.to</a>, <a href="https://medium.com/">Medium</a> or your personal blog.</li>
</ul>
<p>Together, we can make freja <strong>better</strong>!</p>
<h2>Contributing</h2>
<p>First off, thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are <strong>greatly appreciated</strong>.</p>
<p>Please read <a href="docs/CONTRIBUTING.md">our contribution guidelines</a>, and thank you for being involved!</p>
<h2>Authors & contributors</h2>
<p>The original setup of this repository is by <a href="https://github.com/dsorlov">Daniel Sörlöv</a>.</p>
<p>For a full list of all authors and contributors, see <a href="https://github.com/dsorlov/jsfreja/contributors">the contributors page</a>.</p>
<h2>Security</h2>
<p>jsfreja follows good practices of security, but 100% security cannot be assured.
jsfreja is provided <strong>"as is"</strong> without any <strong>warranty</strong>. Use at your own risk.</p>
<p><em>For more information and to report security issues, please refer to our <a href="docs/SECURITY.md">security documentation</a>.</em></p>
<h2>License</h2>
<p>This project is licensed under the <strong>MIT license</strong>.</p>
<p>See <a href="LICENSE">LICENSE</a> for more information.</p>
<h2>Acknowledgements</h2>
<p>Huge thanks to <a href="https://frejaeid.com/">Freja eID Group</a> and specifically <a href="https://github.com/vetobus/">@vetobus</a> for providing me with access to senior technical staff and accepting my suggestions for improvements and beeing so open to the developer community in general.</p>
<p>Also thanks to <a href="https://github.com/auth0">auth0</a> for the excellently stable <a href="https://github.com/auth0/node-jsonwebtoken">jsonwebtoken</a> module used to authenticate the data.</p></article>
</section>
</div>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Wed Feb 26 2025 11:54:57 GMT+0100 (Central European Standard Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
</footer>
<script>prettyPrint();</script>
<script src="scripts/polyfill.js"></script>
<script src="scripts/linenumber.js"></script>
<script src="scripts/search.js" defer></script>
<script src="scripts/collapse.js" defer></script>
</body>
</html>