2019-04-25 04:52:08 +07:00
package handlers
import (
"fmt"
2021-08-11 08:04:35 +07:00
"github.com/authelia/authelia/v4/internal/middlewares"
2019-04-25 04:52:08 +07:00
)
// SecondFactorTOTPPost validate the TOTP passcode provided by the user.
2020-02-01 19:54:50 +07:00
func SecondFactorTOTPPost ( totpVerifier TOTPVerifier ) middlewares . RequestHandler {
return func ( ctx * middlewares . AutheliaCtx ) {
2021-05-05 05:06:05 +07:00
requestBody := signTOTPRequestBody { }
err := ctx . ParseBody ( & requestBody )
2019-04-25 04:52:08 +07:00
2020-02-01 19:54:50 +07:00
if err != nil {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , err , messageMFAValidationFailed )
2020-02-01 19:54:50 +07:00
return
}
2019-04-25 04:52:08 +07:00
2020-02-01 19:54:50 +07:00
userSession := ctx . GetSession ( )
2020-05-06 02:35:32 +07:00
2020-02-01 19:54:50 +07:00
secret , err := ctx . Providers . StorageProvider . LoadTOTPSecret ( userSession . Username )
if err != nil {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , fmt . Errorf ( "Unable to load TOTP secret: %s" , err ) , messageMFAValidationFailed )
2020-02-01 19:54:50 +07:00
return
}
2019-04-25 04:52:08 +07:00
2021-05-05 05:06:05 +07:00
isValid , err := totpVerifier . Verify ( requestBody . Token , secret )
2020-03-25 08:48:20 +07:00
if err != nil {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , fmt . Errorf ( "Error occurred during OTP validation for user %s: %s" , userSession . Username , err ) , messageMFAValidationFailed )
2020-03-25 08:48:20 +07:00
return
}
2019-04-25 04:52:08 +07:00
2020-02-01 19:54:50 +07:00
if ! isValid {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , fmt . Errorf ( "Wrong passcode during TOTP validation for user %s" , userSession . Username ) , messageMFAValidationFailed )
2020-02-01 19:54:50 +07:00
return
}
2019-04-25 04:52:08 +07:00
2020-03-01 06:13:33 +07:00
err = ctx . Providers . SessionProvider . RegenerateSession ( ctx . RequestCtx )
if err != nil {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , fmt . Errorf ( "Unable to regenerate session for user %s: %s" , userSession . Username , err ) , messageMFAValidationFailed )
2020-03-01 06:13:33 +07:00
return
}
feat(oidc): add additional config options, accurate token times, and refactoring (#1991)
* This gives admins more control over their OIDC installation exposing options that had defaults before. Things like lifespans for authorize codes, access tokens, id tokens, refresh tokens, a option to enable the debug client messages, minimum parameter entropy. It also allows admins to configure the response modes.
* Additionally this records specific values about a users session indicating when they performed a specific authz factor so this is represented in the token accurately.
* Lastly we also implemented a OIDC key manager which calculates the kid for jwk's using the SHA1 digest instead of being static, or more specifically the first 7 chars. As per https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key#section-8.1.1 the kid should not exceed 8 chars. While it's allowed to exceed 8 chars, it must only be done so with a compelling reason, which we do not have.
2021-07-04 06:44:30 +07:00
userSession . SetTwoFactor ( ctx . Clock . Now ( ) )
2019-04-25 04:52:08 +07:00
feat(oidc): add additional config options, accurate token times, and refactoring (#1991)
* This gives admins more control over their OIDC installation exposing options that had defaults before. Things like lifespans for authorize codes, access tokens, id tokens, refresh tokens, a option to enable the debug client messages, minimum parameter entropy. It also allows admins to configure the response modes.
* Additionally this records specific values about a users session indicating when they performed a specific authz factor so this is represented in the token accurately.
* Lastly we also implemented a OIDC key manager which calculates the kid for jwk's using the SHA1 digest instead of being static, or more specifically the first 7 chars. As per https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key#section-8.1.1 the kid should not exceed 8 chars. While it's allowed to exceed 8 chars, it must only be done so with a compelling reason, which we do not have.
2021-07-04 06:44:30 +07:00
err = ctx . SaveSession ( userSession )
2019-04-25 04:52:08 +07:00
if err != nil {
2021-07-22 10:52:37 +07:00
handleAuthenticationUnauthorized ( ctx , fmt . Errorf ( "Unable to update the authentication level with TOTP: %s" , err ) , messageMFAValidationFailed )
2019-04-25 04:52:08 +07:00
return
}
2021-05-05 05:06:05 +07:00
if userSession . OIDCWorkflowSession != nil {
feat(oidc): add additional config options, accurate token times, and refactoring (#1991)
* This gives admins more control over their OIDC installation exposing options that had defaults before. Things like lifespans for authorize codes, access tokens, id tokens, refresh tokens, a option to enable the debug client messages, minimum parameter entropy. It also allows admins to configure the response modes.
* Additionally this records specific values about a users session indicating when they performed a specific authz factor so this is represented in the token accurately.
* Lastly we also implemented a OIDC key manager which calculates the kid for jwk's using the SHA1 digest instead of being static, or more specifically the first 7 chars. As per https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key#section-8.1.1 the kid should not exceed 8 chars. While it's allowed to exceed 8 chars, it must only be done so with a compelling reason, which we do not have.
2021-07-04 06:44:30 +07:00
handleOIDCWorkflowResponse ( ctx )
2021-05-05 05:06:05 +07:00
} else {
Handle2FAResponse ( ctx , requestBody . TargetURL )
}
2019-04-25 04:52:08 +07:00
}
}