feat(http): add oauth2 refresh token client
This commit is contained in:
+67
-8
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user