///|
/// dynamic_registration.mbt — RFC 7591 dynamic client registration.
///
/// MCP server login registers a public client at the authorization server's
/// registration endpoint, requesting exactly the grant types the following
/// device/authorization-code flows use.
///|
pub async fn register_client(
registration_endpoint : String,
client_name : String,
transport : &OAuthHttpTransport,
) -> String raise OAuthError {
let headers : Map[String, String] = Map([
("Content-Type", "application/json"),
("Accept", "application/json"),
])
let body = Json::object(
Map([
("client_name", Json::string(client_name)),
(
"grant_types",
Json::array([
Json::string("urn:ietf:params:oauth:grant-type:device_code"),
Json::string("authorization_code"),
]),
),
]),
).stringify()
let response = transport.post(OAuthHttpRequest::{
url: registration_endpoint,
body,
headers,
})
if response.status < 200 || response.status >= 300 {
raise OAuthError::HttpError(
"client registration HTTP status=" +
response.status.to_string() +
", body_chars=" +
response.body.length().to_string(),
)
}
let json = @json.parse(response.body) catch {
err =>
raise OAuthError::ParseError(
"client registration response: " + err.to_string(),
)
}
match json {
Json::Object(map) =>
match map.get("client_id") {
Some(Json::String(client_id)) if client_id.length() > 0 => client_id
_ =>
raise OAuthError::ParseError(
"missing client_id in registration response",
)
}
_ =>
raise OAuthError::ParseError(
"client registration response is not an object",
)
}
}