@@ -29,24 +29,30 @@ static AsyncAuthenticationMiddleware basicAuthHash;
29
29
static AsyncAuthenticationMiddleware digestAuth;
30
30
static AsyncAuthenticationMiddleware digestAuthHash;
31
31
32
+ static AsyncAuthenticationMiddleware bearerAuthSharedKey;
33
+ static AsyncAuthenticationMiddleware bearerAuthJWT;
34
+
32
35
// complex authentication which adds request attributes for the next middlewares and handler
33
36
static 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 {
35
42
return request->requestAuthentication ();
36
43
}
37
44
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" );
43
49
}
44
50
45
51
next ();
46
52
});
47
53
48
54
static AsyncAuthorizationMiddleware authz ([](AsyncWebServerRequest *request) {
49
- return request->getAttribute (" token " ) == " 123 " ;
55
+ return request->getAttribute (" role " ) == " staff " ;
50
56
});
51
57
52
58
void setup () {
@@ -87,6 +93,36 @@ void setup() {
87
93
digestAuthHash.setAuthFailureMessage (" Authentication failed" );
88
94
digestAuthHash.setAuthType (AsyncAuthType::AUTH_DIGEST);
89
95
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
+
90
126
// basic authentication method
91
127
// curl -v -u admin:admin http://192.168.4.1/auth-basic
92
128
server
@@ -132,9 +168,9 @@ void setup() {
132
168
.addMiddleware (&digestAuthHash);
133
169
134
170
// 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
138
174
server
139
175
.on (
140
176
" /auth-custom" , HTTP_GET,
@@ -148,6 +184,32 @@ void setup() {
148
184
)
149
185
.addMiddlewares ({&complexAuth, &authz});
150
186
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
+
151
213
server.begin ();
152
214
}
153
215
0 commit comments