Auth: Passwordless Login Option Using Magic Links (#95436)
* initial passwordless client * passwordless login page * Working basic e2e flow * Add todo comments * Improve the passwordless login flow * improved passwordless login, backend for passwordless signup * add expiration to emails * update email templates & render username & name fields on signup * improve email templates * change login page text while awaiting passwordless code * fix merge conflicts * use claims.TypeUser * add initial passwordless tests * better error messages * simplified error name * remove completed TODOs * linting & minor test improvements & rename passwordless routes * more linting fixes * move code generation to its own func, use locationService to get query params * fix ampersand in email templates & use passwordless api routes in LoginCtrl * txt emails more closely match html email copy * move passwordless auth behind experimental feature toggle * fix PasswordlessLogin property failing typecheck * make update-workspace * user correct placeholder * Update emails/templates/passwordless_verify_existing_user.txt Co-authored-by: Dan Cech <dcech@grafana.com> * Update emails/templates/passwordless_verify_existing_user.mjml Co-authored-by: Dan Cech <dcech@grafana.com> * Update emails/templates/passwordless_verify_new_user.txt Co-authored-by: Dan Cech <dcech@grafana.com> * Update emails/templates/passwordless_verify_new_user.txt Co-authored-by: Dan Cech <dcech@grafana.com> * Update emails/templates/passwordless_verify_new_user.mjml Co-authored-by: Dan Cech <dcech@grafana.com> * use & in email templates * Update emails/templates/passwordless_verify_existing_user.txt Co-authored-by: Dan Cech <dcech@grafana.com> * remove IP address validation * struct for passwordless settings * revert go.work.sum changes * mock locationService.getSearch in failing test --------- Co-authored-by: Mihaly Gyongyosi <mgyongyosi@users.noreply.github.com> Co-authored-by: Dan Cech <dcech@grafana.com>
This commit is contained in:
@@ -271,6 +271,8 @@ type Cfg struct {
|
||||
JWTAuth AuthJWTSettings
|
||||
ExtJWTAuth ExtJWTSettings
|
||||
|
||||
PasswordlessMagicLinkAuth AuthPasswordlessMagicLinkSettings
|
||||
|
||||
// SSO Settings Auth
|
||||
SSOSettingsReloadInterval time.Duration
|
||||
SSOSettingsConfigurableProviders map[string]bool
|
||||
@@ -1248,6 +1250,7 @@ func (cfg *Cfg) parseINIFile(iniFile *ini.File) error {
|
||||
cfg.readAuthExtJWTSettings()
|
||||
cfg.readAuthProxySettings()
|
||||
cfg.readSessionConfig()
|
||||
cfg.readPasswordlessMagicLinkSettings()
|
||||
if err := cfg.readSmtpSettings(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package setting
|
||||
|
||||
import "time"
|
||||
|
||||
type AuthPasswordlessMagicLinkSettings struct {
|
||||
// Passwordless Auth via Magic Link
|
||||
Enabled bool
|
||||
CodeExpiration time.Duration
|
||||
}
|
||||
|
||||
func (cfg *Cfg) readPasswordlessMagicLinkSettings() {
|
||||
authPasswordless := cfg.SectionWithEnvOverrides("auth.passwordless")
|
||||
PasswordlessMagicLinkSettings := AuthPasswordlessMagicLinkSettings{}
|
||||
PasswordlessMagicLinkSettings.Enabled = authPasswordless.Key("enabled").MustBool(false)
|
||||
PasswordlessMagicLinkSettings.CodeExpiration = authPasswordless.Key("code_expiration").MustDuration(time.Minute * 20)
|
||||
cfg.PasswordlessMagicLinkAuth = PasswordlessMagicLinkSettings
|
||||
}
|
||||
Reference in New Issue
Block a user