Mercurial > prosody-modules
comparison mod_http_oauth2/mod_http_oauth2.lua @ 5222:578a72982bb2
mod_http_oauth2: Separate extracting credentials from requests and verifying
The token endpoint also uses Basic auth, but the password would be the
client_secret, so we need to verify against that instead of using
test_password(). Splitting this up here avoids code duplication.
Possibly this new function could go into util.http...
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 07 Mar 2023 15:18:41 +0000 |
| parents | 22483cfce3ce |
| children | 8b2a36847912 |
comparison
equal
deleted
inserted
replaced
| 5221:22483cfce3ce | 5222:578a72982bb2 |
|---|---|
| 339 end | 339 end |
| 340 | 340 |
| 341 return {}; | 341 return {}; |
| 342 end | 342 end |
| 343 | 343 |
| 344 local function check_credentials(request, allow_token) | 344 local function get_request_credentials(request) |
| 345 local auth_type, auth_data = string.match(request.headers.authorization, "^(%S+)%s(.+)$"); | 345 local auth_type, auth_data = string.match(request.headers.authorization, "^(%S+)%s(.+)$"); |
| 346 | 346 |
| 347 if auth_type == "Basic" then | 347 if auth_type == "Basic" then |
| 348 local creds = base64.decode(auth_data); | 348 local creds = base64.decode(auth_data); |
| 349 if not creds then return false; end | 349 if not creds then return; end |
| 350 local username, password = string.match(creds, "^([^:]+):(.*)$"); | 350 local username, password = string.match(creds, "^([^:]+):(.*)$"); |
| 351 if not username then return false; end | 351 if not username then return; end |
| 352 username, password = encodings.stringprep.nodeprep(username), encodings.stringprep.saslprep(password); | 352 return { |
| 353 if not username then return false; end | 353 type = "basic"; |
| 354 username = username; | |
| 355 password = password; | |
| 356 }; | |
| 357 elseif auth_type == "Bearer" then | |
| 358 return { | |
| 359 type = "bearer"; | |
| 360 bearer_token = auth_data; | |
| 361 }; | |
| 362 end | |
| 363 | |
| 364 return nil; | |
| 365 end | |
| 366 | |
| 367 local function check_credentials(request, allow_token) | |
| 368 local credentials = get_request_credentials(request); | |
| 369 if not credentials then return nil; end | |
| 370 | |
| 371 if credentials.username and credentials.password then | |
| 372 local username = encodings.stringprep.nodeprep(credentials.username); | |
| 373 local password = encodings.stringprep.saslprep(credentials.password); | |
| 374 if not (username and password) then return false; end | |
| 354 if not usermanager.test_password(username, module.host, password) then | 375 if not usermanager.test_password(username, module.host, password) then |
| 355 return false; | 376 return false; |
| 356 end | 377 end |
| 357 return username; | 378 return username; |
| 358 elseif auth_type == "Bearer" and allow_token then | 379 elseif allow_token and credentials.bearer_token then |
| 359 local token_info = tokens.get_token_info(auth_data); | 380 local token_info = tokens.get_token_info(credentials.bearer_token); |
| 360 if not token_info or not token_info.session or token_info.session.host ~= module.host then | 381 if not token_info or not token_info.session or token_info.session.host ~= module.host then |
| 361 return false; | 382 return false; |
| 362 end | 383 end |
| 363 return token_info.session.username; | 384 return token_info.session.username; |
| 364 end | 385 end |
