Keycloak 2FA Email Authenticator 使用教程
1. 项目的目录结构及介绍
keycloak-2fa-email-authenticator/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── github/
│ │ │ └── mesutpiskin/
│ │ │ └── keycloak/
│ │ │ └── authenticator/
│ │ │ ├── email/
│ │ │ │ ├── EmailAuthenticatorFactory.java
│ │ │ │ ├── EmailAuthenticator.java
│ │ │ │ └── EmailSender.java
│ │ │ └── otp/
│ │ │ ├── OtpAuthenticatorFactory.java
│ │ │ └── OtpAuthenticator.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── services/
│ │ │ └── org.keycloak.authentication.AuthenticatorFactory
│ │ └── templates/
│ │ ├── html/
│ │ │ └── code-email.ftl
│ │ └── text/
│ │ └── code-email.ftl
├── pom.xml
└── README.md
目录结构介绍
src/main/java/com/github/mesutpiskin/keycloak/authenticator/email/
: 包含实现通过电子邮件发送 OTP 的类。EmailAuthenticatorFactory.java
: 工厂类,用于创建EmailAuthenticator
实例。EmailAuthenticator.java
: 主要实现类,处理 OTP 的发送和验证。EmailSender.java
: 辅助类,用于发送电子邮件。
src/main/java/com/github/mesutpiskin/keycloak/authenticator/otp/
: 包含 OTP 相关的类。OtpAuthenticatorFactory.java
: 工厂类,用于创建OtpAuthenticator
实例。OtpAuthenticator.java
: 主要实现类,处理 OTP 的生成和验证。
src/main/resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory
: 服务提供者配置文件,用于注册自定义的 Authenticator。src/main/resources/templates/
: 包含电子邮件模板文件。html/code-email.ftl
: HTML 格式的电子邮件模板。text/code-email.ftl
: 纯文本格式的电子邮件模板。
pom.xml
: Maven 项目配置文件,包含项目依赖和构建配置。README.md
: 项目说明文档。
2. 项目的启动文件介绍
项目的启动文件主要是 EmailAuthenticatorFactory.java
和 OtpAuthenticatorFactory.java
,这两个文件分别负责创建 EmailAuthenticator
和 OtpAuthenticator
实例。
EmailAuthenticatorFactory.java
package com.github.mesutpiskin.keycloak.authenticator.email;
import org.keycloak.authentication.Authenticator;
import org.keycloak.authentication.AuthenticatorFactory;
import org.keycloak.models.AuthenticationExecutionModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.provider.ProviderConfigProperty;
import java.util.List;
public class EmailAuthenticatorFactory implements AuthenticatorFactory {
public static final String PROVIDER_ID = "email-authenticator";
private static final EmailAuthenticator SINGLETON = new EmailAuthenticator();
@Override
public String getId() {
return PROVIDER_ID;
}
@Override
public String getDisplayType() {
return "Email Authenticator";
}
@Override
public String getReferenceCategory() {
return "email";
}
@Override
public boolean isConfigurable() {
return false;
}
@Override
public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
return new AuthenticationExecutionModel.Requirement[]{
AuthenticationExecutionModel.Requirement.REQUIRED,
AuthenticationExecutionModel.Requirement.ALTERNATIVE,