You've already forked authentication-service
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:
@ -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()?;
|
||||||
|
@ -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()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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>>,
|
||||||
}
|
}
|
||||||
|
@ -95,6 +95,7 @@ pub enum Prompt {
|
|||||||
Login,
|
Login,
|
||||||
Consent,
|
Consent,
|
||||||
SelectAccount,
|
SelectAccount,
|
||||||
|
Create,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[serde_as]
|
#[serde_as]
|
||||||
|
Reference in New Issue
Block a user