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