feat(http): add oauth2 refresh token client

This commit is contained in:
2022-05-23 20:37:26 +02:00
parent 8892337b93
commit de00c532c8
9 changed files with 324 additions and 70 deletions
@@ -20,11 +20,15 @@ import 'dart:io';
import 'package:wyatt_http_client/src/authentication/basic_authentication_client.dart';
import 'package:wyatt_http_client/src/authentication/bearer_authentication_client.dart';
import 'package:wyatt_http_client/src/authentication/digest_authentication_client.dart';
import 'package:wyatt_http_client/src/authentication/refresh_token_client.dart';
import 'package:wyatt_http_client/src/authentication/unsafe_authentication_client.dart';
import 'package:wyatt_http_client/src/rest_client.dart';
import 'package:wyatt_http_client/src/utils/header_keys.dart';
import 'package:wyatt_http_client/src/utils/protocols.dart';
String lastToken = '';
int token = 0;
void printAuth(HttpRequest req) {
print(
'Authorization => '
@@ -39,8 +43,7 @@ Future<void> handleBasic(HttpRequest req) async {
Future<void> handleBasicNegotiate(HttpRequest req) async {
if (req.headers.value('Authorization') == null) {
req.response.statusCode = HttpStatus.unauthorized;
req.response.headers
.set(HeaderKeys.wwwAuthenticate.toString(), 'Basic realm="Wyatt"');
req.response.headers.set(HeaderKeys.wwwAuthenticate, 'Basic realm="Wyatt"');
print(req.response.headers.value('WWW-Authenticate'));
return req.response.close();
}
@@ -74,6 +77,47 @@ Future<void> handleUnsafe(HttpRequest req) async {
);
}
Future<void> handleOauth2RefreshToken(HttpRequest req) async {
final action = req.uri.queryParameters['action'];
if (action == null) {
printAuth(req);
}
switch (action) {
case 'login':
if (req.method == 'POST') {
token++;
req.response.write(
'{"accessToken": "access-token-awesome$token", '
'"refreshToken": "refresh-token-awesome$token"}',
);
}
break;
case 'refresh':
printAuth(req);
if (req.method == 'GET') {
token++;
req.response.write('{"accessToken": "access-token-refreshed$token"}');
}
break;
case 'access-denied':
final String receivedToken = req.headers.value('Authorization') ?? '';
if (receivedToken != '' &&
lastToken != '' &&
receivedToken != lastToken) {
lastToken = receivedToken;
printAuth(req);
return req.response.close();
} else {
lastToken = receivedToken;
req.response.statusCode = HttpStatus.unauthorized;
return req.response.close();
}
default:
break;
}
}
Future<void> server() async {
final server = await HttpServer.bind(InternetAddress.anyIPv6, 8080);
var error = 0;
@@ -99,6 +143,9 @@ Future<void> server() async {
case '/test/unsafe-test':
handleUnsafe(request);
break;
case '/test/oauth2-test':
handleOauth2RefreshToken(request);
break;
case '/test/bearer-login':
if (request.method == 'POST') {
@@ -121,12 +168,6 @@ Future<void> server() async {
print('Error $error');
request.response.statusCode = HttpStatus.unauthorized;
break;
case '/test/oauth2-test':
print(
'Authorization => '
"${request.headers.value('Authorization') ?? 'no access token'}",
);
break;
case '/test/oauth2-login':
if (request.method == 'POST') {
token++;
@@ -213,5 +254,23 @@ Future<void> main() async {
);
await unsafe.get(Uri.parse('/test/unsafe-test'));
// OAuth2
final refreshToken = RefreshTokenClient(
authorizationEndpoint: '/test/oauth2-test?action=login',
tokenEndpoint: '/test/oauth2-test?action=refresh',
accessTokenParser: (body) => body['accessToken']! as String,
refreshTokenParser: (body) => body['refreshToken']! as String,
inner: restClient,
);
await refreshToken.get(Uri.parse('/test/oauth2-test'));
await refreshToken.authorize(<String, String>{
'username': 'username',
'password': 'password',
});
await refreshToken.get(Uri.parse('/test/oauth2-test'));
await refreshToken.refresh();
await refreshToken.get(Uri.parse('/test/oauth2-test'));
await refreshToken.get(Uri.parse('/test/oauth2-test?action=access-denied'));
exit(0);
}