complete redesign
This commit is contained in:
parent
4c27d0eace
commit
f39759bad9
@ -1,8 +1,6 @@
|
|||||||
# auth-server-helper
|
# auth-server-helper
|
||||||
|
|
||||||
version: 0.0.0
|
version: 2.0.0
|
||||||
|
|
||||||
undefined
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Sapphirecode - All Rights Reserved
|
||||||
|
* This file is part of Auth-Server-Helper which is released under MIT.
|
||||||
|
* See file 'LICENSE' for full license details.
|
||||||
|
* Created by Timo Hocker <timo@scode.ovh>, January 2021
|
||||||
|
*/
|
||||||
|
|
||||||
import { IncomingMessage, ServerResponse } from 'http';
|
import { IncomingMessage, ServerResponse } from 'http';
|
||||||
import { to_utf8 } from '@sapphirecode/encoding-helper';
|
import { to_utf8 } from '@sapphirecode/encoding-helper';
|
||||||
import auth from './Authority';
|
import auth from './Authority';
|
||||||
@ -29,16 +36,19 @@ class AuthRequest {
|
|||||||
public is_basic: boolean;
|
public is_basic: boolean;
|
||||||
public user: string;
|
public user: string;
|
||||||
public password: string;
|
public password: string;
|
||||||
|
public body: string;
|
||||||
|
|
||||||
private _cookie_name?: string;
|
private _cookie_name?: string;
|
||||||
|
|
||||||
public constructor (
|
public constructor (
|
||||||
req: IncomingMessage,
|
req: IncomingMessage,
|
||||||
res: ServerResponse,
|
res: ServerResponse,
|
||||||
|
body: string,
|
||||||
cookie?: string
|
cookie?: string
|
||||||
) {
|
) {
|
||||||
this.request = req;
|
this.request = req;
|
||||||
this.response = res;
|
this.response = res;
|
||||||
|
this.body = body;
|
||||||
this.is_basic = false;
|
this.is_basic = false;
|
||||||
this.user = '';
|
this.user = '';
|
||||||
this.password = '';
|
this.password = '';
|
||||||
@ -88,6 +98,23 @@ class AuthRequest {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public allow_part (part_token_expires_in: number, module: string): string {
|
||||||
|
this.default_header ();
|
||||||
|
|
||||||
|
const pt = auth.sign ('part_token', part_token_expires_in, module);
|
||||||
|
|
||||||
|
const res = {
|
||||||
|
token_type: 'bearer',
|
||||||
|
part_token: pt.signature,
|
||||||
|
expires_in: part_token_expires_in
|
||||||
|
};
|
||||||
|
|
||||||
|
this.response.writeHead (200);
|
||||||
|
this.response.end (JSON.stringify (res));
|
||||||
|
|
||||||
|
return pt.id;
|
||||||
|
}
|
||||||
|
|
||||||
public invalid (error_description?: string) {
|
public invalid (error_description?: string) {
|
||||||
this.default_header ();
|
this.default_header ();
|
||||||
this.response.writeHead (400);
|
this.response.writeHead (400);
|
||||||
@ -117,11 +144,22 @@ export default function create_auth_handler (
|
|||||||
default_handler: AuthRequestHandler,
|
default_handler: AuthRequestHandler,
|
||||||
options?: CreateHandlerOptions
|
options?: CreateHandlerOptions
|
||||||
) {
|
) {
|
||||||
return function process_request (
|
// eslint-disable-next-line max-lines-per-function
|
||||||
|
return async function process_request (
|
||||||
req: IncomingMessage,
|
req: IncomingMessage,
|
||||||
res: ServerResponse
|
res: ServerResponse
|
||||||
): Promise<void>|void {
|
): Promise<void> {
|
||||||
const request = new AuthRequest (req, res, options?.cookie_name);
|
const body: string = await new Promise ((resolve) => {
|
||||||
|
let data = '';
|
||||||
|
req.on ('data', (c) => {
|
||||||
|
data += c;
|
||||||
|
});
|
||||||
|
req.on ('end', () => {
|
||||||
|
resolve (data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const request = new AuthRequest (req, res, body, options?.cookie_name);
|
||||||
const token = (/(?<type>\S+) (?<token>.+)/ui)
|
const token = (/(?<type>\S+) (?<token>.+)/ui)
|
||||||
.exec (req.headers.authorization as string);
|
.exec (req.headers.authorization as string);
|
||||||
|
|
||||||
|
@ -46,4 +46,4 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Sapphirecode - All Rights Reserved
|
||||||
|
* This file is part of Auth-Server-Helper which is released under MIT.
|
||||||
|
* See file 'LICENSE' for full license details.
|
||||||
|
* Created by Timo Hocker <timo@scode.ovh>, January 2021
|
||||||
|
*/
|
||||||
|
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
|
|
||||||
export class Response extends http.IncomingMessage {
|
export class Response extends http.IncomingMessage {
|
||||||
@ -5,19 +12,27 @@ export class Response extends http.IncomingMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function get (
|
export function get (
|
||||||
headers: http.OutgoingHttpHeaders = {}
|
// eslint-disable-next-line default-param-last
|
||||||
|
headers: http.OutgoingHttpHeaders = {},
|
||||||
|
body?: string
|
||||||
): Promise<Response> {
|
): Promise<Response> {
|
||||||
return new Promise ((resolve) => {
|
return new Promise ((resolve) => {
|
||||||
http.get ('http://localhost:3000', { headers }, (res: Response) => {
|
const req = http.request ('http://localhost:3000', {
|
||||||
let body = '';
|
headers,
|
||||||
|
method: typeof body === 'string' ? 'POST' : 'GET'
|
||||||
|
}, (res: Response) => {
|
||||||
|
let data = '';
|
||||||
res.on ('data', (d) => {
|
res.on ('data', (d) => {
|
||||||
body += d;
|
data += d;
|
||||||
});
|
});
|
||||||
res.on ('end', () => {
|
res.on ('end', () => {
|
||||||
res.body = body;
|
res.body = data;
|
||||||
resolve (res);
|
resolve (res);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
if (typeof body === 'string')
|
||||||
|
req.write (body);
|
||||||
|
req.end ();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Sapphirecode - All Rights Reserved
|
||||||
|
* This file is part of Auth-Server-Helper which is released under MIT.
|
||||||
|
* See file 'LICENSE' for full license details.
|
||||||
|
* Created by Timo Hocker <timo@scode.ovh>, January 2021
|
||||||
|
*/
|
||||||
|
|
||||||
import http, { IncomingMessage, ServerResponse } from 'http';
|
import http, { IncomingMessage, ServerResponse } from 'http';
|
||||||
import { to_b64 } from '@sapphirecode/encoding-helper';
|
import { to_b64 } from '@sapphirecode/encoding-helper';
|
||||||
import auth from '../../lib/Authority';
|
import auth from '../../lib/Authority';
|
||||||
@ -46,22 +53,37 @@ describe ('auth handler', () => {
|
|||||||
if (!req.is_basic) {
|
if (!req.is_basic) {
|
||||||
req.invalid ('unknown autorization type');
|
req.invalid ('unknown autorization type');
|
||||||
}
|
}
|
||||||
else if (req.user !== 'foo' || req.password !== 'bar') {
|
else if (req.user === 'foo' && req.password === 'bar') {
|
||||||
req.deny ();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
req.allow_access ({
|
req.allow_access ({
|
||||||
access_token_expires_in: expires_seconds,
|
access_token_expires_in: expires_seconds,
|
||||||
include_refresh_token: true,
|
include_refresh_token: true,
|
||||||
refresh_token_expires_in: refresh_expires_seconds
|
refresh_token_expires_in: refresh_expires_seconds
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if (req.user === 'part' && req.password === 'bar') {
|
||||||
|
req.allow_part (part_expires_seconds, 'two_factor');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
req.deny ();
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
cookie_name: 'cookie_jar',
|
cookie_name: 'cookie_jar',
|
||||||
refresh: {
|
refresh: {
|
||||||
access_token_expires_in: expires_seconds,
|
access_token_expires_in: expires_seconds,
|
||||||
refresh_token_expires_in: refresh_expires_seconds,
|
refresh_token_expires_in: refresh_expires_seconds,
|
||||||
include_refresh_token: true
|
include_refresh_token: true
|
||||||
|
},
|
||||||
|
modules: {
|
||||||
|
two_factor (request) {
|
||||||
|
if (request.body === 'letmein') {
|
||||||
|
request.allow_access ({
|
||||||
|
access_token_expires_in: expires_seconds,
|
||||||
|
include_refresh_token: true,
|
||||||
|
refresh_token_expires_in: refresh_expires_seconds
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else { request.deny (); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -183,7 +205,7 @@ describe ('auth handler', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
xit ('should process part token', async () => {
|
it ('should process part token', async () => {
|
||||||
const resp1 = await get ({ authorization: 'Basic part:bar' });
|
const resp1 = await get ({ authorization: 'Basic part:bar' });
|
||||||
expect (resp1.statusCode)
|
expect (resp1.statusCode)
|
||||||
.toEqual (200);
|
.toEqual (200);
|
||||||
@ -195,7 +217,8 @@ describe ('auth handler', () => {
|
|||||||
check_token (res1.data.part_token as string, 'part_token');
|
check_token (res1.data.part_token as string, 'part_token');
|
||||||
|
|
||||||
const resp2 = await get (
|
const resp2 = await get (
|
||||||
{ authorization: `Bearer ${res1.data.part_token}` }
|
{ authorization: `Bearer ${res1.data.part_token}` },
|
||||||
|
'letmein'
|
||||||
);
|
);
|
||||||
expect (resp2.statusCode)
|
expect (resp2.statusCode)
|
||||||
.toEqual (200);
|
.toEqual (200);
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Sapphirecode - All Rights Reserved
|
||||||
|
* This file is part of Auth-Server-Helper which is released under MIT.
|
||||||
|
* See file 'LICENSE' for full license details.
|
||||||
|
* Created by Timo Hocker <timo@scode.ovh>, January 2021
|
||||||
|
*/
|
||||||
|
|
||||||
import http from 'http';
|
import http from 'http';
|
||||||
import gateway from '../../lib/Gateway';
|
import gateway from '../../lib/Gateway';
|
||||||
import authority from '../../lib/Authority';
|
import authority from '../../lib/Authority';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user