@@ -29,24 +29,30 @@ static AsyncAuthenticationMiddleware basicAuthHash;
2929static AsyncAuthenticationMiddleware digestAuth;
3030static AsyncAuthenticationMiddleware digestAuthHash;
3131
32+ static AsyncAuthenticationMiddleware bearerAuthSharedKey;
33+ static AsyncAuthenticationMiddleware bearerAuthJWT;
34+
3235// complex authentication which adds request attributes for the next middlewares and handler
3336static AsyncMiddlewareFunction complexAuth ([](AsyncWebServerRequest *request, ArMiddlewareNext next) {
34- if (!request->authenticate (" user" , " password" )) {
37+ if (request->authenticate (" Mathieu" , " password" )) {
38+ request->setAttribute (" user" , " Mathieu" );
39+ } else if (request->authenticate (" Bob" , " password" )) {
40+ request->setAttribute (" user" , " Bob" );
41+ } else {
3542 return request->requestAuthentication ();
3643 }
3744
38- // add attributes to the request for the next middlewares and handler
39- request->setAttribute (" user" , " Mathieu" );
40- request->setAttribute (" role" , " staff" );
41- if (request->hasParam (" token" )) {
42- request->setAttribute (" token" , request->getParam (" token" )->value ().c_str ());
45+ if (request->getAttribute (" user" ) == " Mathieu" ) {
46+ request->setAttribute (" role" , " staff" );
47+ } else {
48+ request->setAttribute (" role" , " user" );
4349 }
4450
4551 next ();
4652});
4753
4854static AsyncAuthorizationMiddleware authz ([](AsyncWebServerRequest *request) {
49- return request->getAttribute (" token " ) == " 123 " ;
55+ return request->getAttribute (" role " ) == " staff " ;
5056});
5157
5258void setup () {
@@ -87,6 +93,36 @@ void setup() {
8793 digestAuthHash.setAuthFailureMessage (" Authentication failed" );
8894 digestAuthHash.setAuthType (AsyncAuthType::AUTH_DIGEST);
8995
96+ // bearer authentication with shared key
97+ bearerAuthSharedKey.setAuthType (AsyncAuthType::AUTH_BEARER);
98+ bearerAuthSharedKey.setToken (" shared-secret-key" );
99+
100+ // bearer authentication with a JWT token
101+ bearerAuthJWT.setAuthType (AsyncAuthType::AUTH_BEARER);
102+ bearerAuthJWT.setAuthentificationFunction ([](AsyncWebServerRequest *request) {
103+ const String& token = request->authChallenge ();
104+ // 1. decode base64 token
105+ // 2. decrypt token
106+ const String& decrypted = " ..." ; // TODO
107+ // 3. validate token (check signature, expiration, etc)
108+ bool valid = token == " <token>" || token == " <another token>" ;
109+ if (!valid) {
110+ return false ;
111+ }
112+ // 4. extract user info from token and set request attributes
113+ if (token == " <token>" ) {
114+ request->setAttribute (" user" , " Mathieu" );
115+ request->setAttribute (" role" , " staff" );
116+ return true ; // return true if token is valid, false otherwise
117+ }
118+ if (token == " <another token>" ) {
119+ request->setAttribute (" user" , " Bob" );
120+ request->setAttribute (" role" , " user" );
121+ return true ; // return true if token is valid, false otherwise
122+ }
123+ return false ;
124+ });
125+
90126 // basic authentication method
91127 // curl -v -u admin:admin http://192.168.4.1/auth-basic
92128 server
@@ -132,9 +168,9 @@ void setup() {
132168 .addMiddleware (&digestAuthHash);
133169
134170 // test digest auth custom authorization middleware
135- // curl -v --digest -u user :password http://192.168.4.1/auth-custom?token=123 => OK
136- // curl -v --digest -u user :password http://192.168.4.1/auth-custom?token=456 => 403
137- // curl -v --digest -u user:FAILED http://192.168.4.1/auth-custom?token=456 => 401
171+ // curl -v --digest -u Mathieu :password http://192.168.4.1/auth-custom => OK
172+ // curl -v --digest -u Bob :password http://192.168.4.1/auth-custom => 403
173+ // curl -v --digest -u any:password http://192.168.4.1/auth-custom => 401
138174 server
139175 .on (
140176 " /auth-custom" , HTTP_GET,
@@ -148,6 +184,32 @@ void setup() {
148184 )
149185 .addMiddlewares ({&complexAuth, &authz});
150186
187+ // Bearer authentication with a shared key
188+ // curl -v -H "Authorization: Bearer shared-secret-key" http://192.168.4.1/auth-bearer-shared-key => OK
189+ server
190+ .on (
191+ " /auth-bearer-shared-key" , HTTP_GET,
192+ [](AsyncWebServerRequest *request) {
193+ request->send (200 , " text/plain" , " Hello, world!" );
194+ }
195+ )
196+ .addMiddleware (&bearerAuthSharedKey);
197+
198+ // Bearer authentication with a JWT token
199+ // curl -v -H "Authorization: Bearer <token>" http://192.168.4.1/auth-bearer-jwt => OK
200+ // curl -v -H "Authorization: Bearer <another token>" http://192.168.4.1/auth-bearer-jwt => 403 Forbidden
201+ // curl -v -H "Authorization: Bearer invalid-token" http://192.168.4.1/auth-bearer-jwt => 401 Unauthorized
202+ server
203+ .on (
204+ " /auth-bearer-jwt" , HTTP_GET,
205+ [](AsyncWebServerRequest *request) {
206+ Serial.println (" User: " + request->getAttribute (" user" ));
207+ Serial.println (" Role: " + request->getAttribute (" role" ));
208+ request->send (200 , " text/plain" , " Hello, world!" );
209+ }
210+ )
211+ .addMiddlewares ({&bearerAuthJWT, &authz});
212+
151213 server.begin ();
152214}
153215
0 commit comments