parseMcpAuthorizationCallback function

McpAuthorizationCode parseMcpAuthorizationCallback(
  1. Uri callbackUri, {
  2. required McpAuthorizationRequest request,
})

Validates an OAuth redirect callback for request.

Implementation

McpAuthorizationCode parseMcpAuthorizationCallback(
  Uri callbackUri, {
  required McpAuthorizationRequest request,
}) {
  final parameters = callbackUri.queryParametersAll;
  _validateAuthorizationResponseIssuer(parameters, request);
  _validateAuthorizationCallbackTarget(callbackUri, request.redirectUri);

  for (final name in _authorizationCallbackParameters) {
    final values = parameters[name];
    if (values != null && values.length != 1) {
      throw McpAuthorizationFlowException(
        'Authorization callback parameter "$name" must occur exactly once.',
        uri: callbackUri,
      );
    }
  }

  final state = _singleParameter(parameters, 'state');
  if (state == null || state != request.state) {
    throw McpAuthorizationFlowException(
      'Authorization callback state does not match the request.',
      uri: callbackUri,
    );
  }

  final code = _singleParameter(parameters, 'code');
  final error = _singleParameter(parameters, 'error');
  if ((code == null) == (error == null)) {
    throw McpAuthorizationFlowException(
      'Authorization callback must contain exactly one code or error.',
      uri: callbackUri,
    );
  }

  if (error != null) {
    if (!_oauthNqsCharValid(error)) {
      throw McpAuthorizationFlowException(
        'Authorization callback error is malformed.',
        uri: callbackUri,
      );
    }
    final description = _singleParameter(parameters, 'error_description');
    if (description != null && !_oauthNqsCharValid(description)) {
      throw McpAuthorizationFlowException(
        'Authorization callback error_description is malformed.',
        uri: callbackUri,
      );
    }
    final errorUri = _optionalErrorUri(
      _singleParameter(parameters, 'error_uri'),
      callbackUri,
    );
    throw McpAuthorizationFlowException(
      description ?? 'Authorization server returned "$error".',
      uri: callbackUri,
      oauthError: error,
      errorDescription: description,
      errorUri: errorUri,
    );
  }

  if (!_oauthVsCharValid(code!)) {
    throw McpAuthorizationFlowException(
      'Authorization callback code is malformed.',
      uri: callbackUri,
    );
  }
  return McpAuthorizationCode._(
    code: code,
    callbackUri: callbackUri,
    request: request,
  );
}