1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-07-31 09:24:31 +03:00

Support prompt=create

Allows RPs to ask for account creation

See https://openid.net/specs/openid-connect-prompt-create-1_0.html
This commit is contained in:
Quentin Gliech
2022-03-14 16:33:24 +01:00
parent 794a1b8651
commit 8e9bda654f
4 changed files with 27 additions and 3 deletions

View File

@ -73,7 +73,7 @@ use warp::{
Filter, Rejection, Reply, Filter, Rejection, Reply,
}; };
use crate::views::{LoginRequest, PostAuthAction, ReauthRequest}; use crate::views::{LoginRequest, PostAuthAction, ReauthRequest, RegisterRequest};
#[derive(Deserialize)] #[derive(Deserialize)]
struct PartialParams { struct PartialParams {
@ -310,6 +310,7 @@ async fn actually_reply(
.wrap_error() .wrap_error()
} }
#[allow(clippy::too_many_lines)]
async fn get( async fn get(
params: Params, params: Params,
maybe_session: Option<BrowserSession<PostgresqlBackend>>, maybe_session: Option<BrowserSession<PostgresqlBackend>>,
@ -427,6 +428,16 @@ async fn get(
// Other cases where we already have a session // Other cases where we already have a session
step(next, user_session, txn).await step(next, user_session, txn).await
} }
(None, Some(Prompt::Create)) => {
// Client asked for a registration, show the registration prompt
txn.commit().await.wrap_error()?;
let next: PostAuthAction = next.into();
let next: RegisterRequest = next.into();
let next = next.build_uri().wrap_error()?;
Ok(ReplyOrBackToClient::Reply(Box::new(see_other(next))))
}
(None, _) => { (None, _) => {
// Other cases where we don't have a session, ask for a login // Other cases where we don't have a session, ask for a login
txn.commit().await.wrap_error()?; txn.commit().await.wrap_error()?;

View File

@ -26,7 +26,7 @@ use mas_jose::SigningKeystore;
use mas_warp_utils::filters::{self, url_builder::UrlBuilder}; use mas_warp_utils::filters::{self, url_builder::UrlBuilder};
use oauth2_types::{ use oauth2_types::{
oidc::{ClaimType, Metadata, SubjectType}, oidc::{ClaimType, Metadata, SubjectType},
requests::{Display, GrantType, ResponseMode}, requests::{Display, GrantType, Prompt, ResponseMode},
scope, scope,
}; };
use warp::{filters::BoxedFilter, Filter, Reply}; use warp::{filters::BoxedFilter, Filter, Reply};
@ -158,6 +158,14 @@ pub(super) fn filter(
let request_parameter_supported = Some(false); let request_parameter_supported = Some(false);
let request_uri_parameter_supported = Some(false); let request_uri_parameter_supported = Some(false);
let prompt_values_supported = Some({
let mut s = HashSet::new();
s.insert(Prompt::None);
s.insert(Prompt::Login);
s.insert(Prompt::Create);
s
});
let metadata = Metadata { let metadata = Metadata {
issuer, issuer,
authorization_endpoint, authorization_endpoint,
@ -182,6 +190,7 @@ pub(super) fn filter(
claims_parameter_supported, claims_parameter_supported,
request_parameter_supported, request_parameter_supported,
request_uri_parameter_supported, request_uri_parameter_supported,
prompt_values_supported,
..Metadata::default() ..Metadata::default()
}; };

View File

@ -25,7 +25,7 @@ use serde::Serialize;
use serde_with::skip_serializing_none; use serde_with::skip_serializing_none;
use url::Url; use url::Url;
use crate::requests::{Display, GrantType, ResponseMode}; use crate::requests::{Display, GrantType, Prompt, ResponseMode};
#[derive(Serialize, Clone, Copy, PartialEq, Eq, Hash, Debug)] #[derive(Serialize, Clone, Copy, PartialEq, Eq, Hash, Debug)]
#[serde(rename_all = "lowercase")] #[serde(rename_all = "lowercase")]
@ -234,4 +234,7 @@ pub struct Metadata {
/// Indicates whether the authorization server accepts authorization /// Indicates whether the authorization server accepts authorization
/// requests only via PAR. /// requests only via PAR.
pub require_pushed_authorization_requests: Option<bool>, pub require_pushed_authorization_requests: Option<bool>,
/// Array containing the list of prompt values that this OP supports.
pub prompt_values_supported: Option<HashSet<Prompt>>,
} }

View File

@ -95,6 +95,7 @@ pub enum Prompt {
Login, Login,
Consent, Consent,
SelectAccount, SelectAccount,
Create,
} }
#[serde_as] #[serde_as]