keycloak~自定义directgrant直接认证

语言: CN / TW / HK

direct grant我们把它理解为通过rest接口直接认证,这是oauth2里的密码认证方式,即 grant_type=password ,它不需要走授权码这种复杂的流程,相当于传统的表单认证;keycloak事实上为我们准备了一个direct grant,只不过它只能使用username和password进行认证,如果你希望使用email,phoneNumber来进行密码认证,则需要另外去开发,下面就是开发的步骤:

  • 添加provider和providerFactory

    你的SelfDirectGrantAuthenticator需要继承AbstractUsernameFormAuthenticator,当然继承Authenticator也是可以的,因为我们并不需要进行表单交互。

public class V6DirectGrantAuthenticator extends AbstractUsernameFormAuthenticator {
  KeycloakSession session;

  public V6DirectGrantAuthenticator(KeycloakSession session) {
    this.session = session;
  }

  @Override
  public void authenticate(AuthenticationFlowContext context) {
    String username = Optional.ofNullable(context.getHttpRequest().getDecodedFormParameters().getFirst("username"))
        .orElse(context.getHttpRequest().getDecodedFormParameters().getFirst("username"));
    String password = Optional.ofNullable(context.getHttpRequest().getDecodedFormParameters().getFirst("password"))
        .orElse(context.getHttpRequest().getDecodedFormParameters().getFirst("password"));
    if (用户名密码==正确) {
      context.success();
    }
  }

  @Override
  public void action(AuthenticationFlowContext context) {
    authenticate(context);
  }

}
  • 注册到org.keycloak.authentication.AuthenticatorFactory

  • keycloak管理平台,添加验证,可以从默认的direct grant上复制

  • 将直接认证流程改成刚刚建立的

  • 现在就可以在postman里,脱离浏览器,进行认证了,并直接返回access_token