keycloak-memoizeit

Details

diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index da8aac6..231aed4 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -116,7 +116,7 @@ public class AccountService {
             accessCodeEntry.getRequiredActions().remove(UserModel.RequiredAction.UPDATE_PROFILE);
         }
 
-        Response response = redirectOauth(accessCodeEntry);
+        Response response = redirectOauth(user, accessCodeEntry);
         if (response != null) {
             return response;
         } else {
@@ -161,8 +161,7 @@ public class AccountService {
             return null;
         }
 
-        if (accessCodeEntry.getRequiredActions() == null
-                || !accessCodeEntry.getRequiredActions().contains(requiredAction)) {
+        if (accessCodeEntry.getRequiredActions() == null || !accessCodeEntry.getRequiredActions().contains(requiredAction)) {
             return null;
         }
 
@@ -208,7 +207,7 @@ public class AccountService {
 
         user.setTotp(true);
 
-        Response response = redirectOauth(accessCodeEntry);
+        Response response = redirectOauth(user, accessCodeEntry);
         if (response != null) {
             return response;
         } else {
@@ -231,7 +230,7 @@ public class AccountService {
             accessCodeEntry.getRequiredActions().remove(UserModel.RequiredAction.VERIFY_EMAIL);
         }
 
-        Response response = redirectOauth(accessCodeEntry);
+        Response response = redirectOauth(user, accessCodeEntry);
         if (response != null) {
             return response;
         } else {
@@ -239,17 +238,24 @@ public class AccountService {
         }
     }
 
-    private Response redirectOauth(AccessCodeEntry accessCodeEntry) {
-        if (accessCodeEntry == null) {
+    private Response redirectOauth(UserModel user, AccessCodeEntry accessCode) {
+        if (accessCode == null) {
             return null;
         }
-        String redirect = uriInfo.getQueryParameters().getFirst("redirect_uri");
-        if (redirect != null) {
-            String state = uriInfo.getQueryParameters().getFirst("state");
-            return Flows.oauth(realm, request, uriInfo, authManager, tokenManager).redirectAccessCode(accessCodeEntry, state,
-                    redirect);
+
+        Set<RequiredAction> requiredActions = user.getRequiredActions();
+        if (!requiredActions.isEmpty()) {
+            return Flows.forms(realm, request, uriInfo).setCode(accessCode.getCode()).setUser(user)
+                    .forwardToAction(requiredActions.iterator().next());
         } else {
-            return null;
+            String redirect = uriInfo.getQueryParameters().getFirst("redirect_uri");
+            if (redirect != null) {
+                String state = uriInfo.getQueryParameters().getFirst("state");
+                return Flows.oauth(realm, request, uriInfo, authManager, tokenManager).redirectAccessCode(accessCode, state,
+                        redirect);
+            } else {
+                return null;
+            }
         }
     }