()
| 51 | } |
| 52 | |
| 53 | pub async fn login_handler() -> Response { |
| 54 | let client = match get_client().await { |
| 55 | Ok(v) => v, |
| 56 | Err(e) => { |
| 57 | error!(error = %e.full(), "Get OIDC client error"); |
| 58 | return (StatusCode::INTERNAL_SERVER_ERROR, "Internal error").into_response(); |
| 59 | } |
| 60 | }; |
| 61 | |
| 62 | let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256(); |
| 63 | |
| 64 | let conf = config::get(); |
| 65 | let mut request = client.authorize_url( |
| 66 | AuthenticationFlow::<CoreResponseType>::AuthorizationCode, |
| 67 | CsrfToken::new_random, |
| 68 | Nonce::new_random, |
| 69 | ); |
| 70 | for scope in &conf.user_authentication.openid_connect.scopes { |
| 71 | request = request.add_scope(Scope::new(scope.to_string())) |
| 72 | } |
| 73 | |
| 74 | request = request.set_pkce_challenge(pkce_challenge); |
| 75 | |
| 76 | let (auth_url, csrf_state, nonce) = request.url(); |
| 77 | |
| 78 | if let Err(e) = store_nonce(&csrf_state, &nonce).await { |
| 79 | error!(error = %e.full(), "Store nonce error"); |
| 80 | return (StatusCode::INTERNAL_SERVER_ERROR, "Internal error").into_response(); |
| 81 | } |
| 82 | |
| 83 | if let Err(e) = store_verifier(&csrf_state, &pkce_verifier).await { |
| 84 | error!(error = %e.full(), "Store PKCE verifier error"); |
| 85 | return (StatusCode::INTERNAL_SERVER_ERROR, "Internal error").into_response(); |
| 86 | } |
| 87 | |
| 88 | Redirect::temporary(auth_url.as_str()).into_response() |
| 89 | } |
| 90 | |
| 91 | pub async fn callback_handler(args: Query<CallbackArgs>) -> Response { |
| 92 | let args: CallbackArgs = args.0; |
nothing calls this directly
no test coverage detected