mirror of
https://github.com/bitwarden/server
synced 2025-12-29 06:33:43 +00:00
fix(invalid-auth-request-approvals): Auth/[PM-3387] Better Error Handling for Invalid Auth Request Approval (#6264)
If a user approves an invalid auth request, on the Requesting Device they currently they get stuck on the `LoginViaAuthRequestComponent` with a spinning wheel. This PR makes it so that when an Approving Device attempts to approve an invalid auth request, the Approving Device receives an error toast and the `UpdateAuthRequestAsync()` operation is blocked.
This commit is contained in:
@@ -102,7 +102,37 @@ public class AuthRequestsController(
|
||||
public async Task<AuthRequestResponseModel> Put(Guid id, [FromBody] AuthRequestUpdateRequestModel model)
|
||||
{
|
||||
var userId = _userService.GetProperUserId(User).Value;
|
||||
|
||||
// If the Approving Device is attempting to approve a request, validate the approval
|
||||
if (model.RequestApproved == true)
|
||||
{
|
||||
await ValidateApprovalOfMostRecentAuthRequest(id, userId);
|
||||
}
|
||||
|
||||
var authRequest = await _authRequestService.UpdateAuthRequestAsync(id, userId, model);
|
||||
return new AuthRequestResponseModel(authRequest, _globalSettings.BaseServiceUri.Vault);
|
||||
}
|
||||
|
||||
private async Task ValidateApprovalOfMostRecentAuthRequest(Guid id, Guid userId)
|
||||
{
|
||||
// Get the current auth request to find the device identifier
|
||||
var currentAuthRequest = await _authRequestService.GetAuthRequestAsync(id, userId);
|
||||
if (currentAuthRequest == null)
|
||||
{
|
||||
throw new NotFoundException();
|
||||
}
|
||||
|
||||
// Get all pending auth requests for this user (returns most recent per device)
|
||||
var pendingRequests = await _authRequestRepository.GetManyPendingAuthRequestByUserId(userId);
|
||||
|
||||
// Find the most recent request for the same device
|
||||
var mostRecentForDevice = pendingRequests
|
||||
.FirstOrDefault(pendingRequest => pendingRequest.RequestDeviceIdentifier == currentAuthRequest.RequestDeviceIdentifier);
|
||||
|
||||
var isMostRecentRequestForDevice = mostRecentForDevice?.Id == id;
|
||||
if (!isMostRecentRequestForDevice)
|
||||
{
|
||||
throw new BadRequestException("This request is no longer valid. Make sure to approve the most recent request.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user