parseMcpAuthorizationCallback function
McpAuthorizationCode
parseMcpAuthorizationCallback(
- Uri callbackUri, {
- 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,
);
}