Skip to content

Commit a7fd1bc

Browse files
thomasdarimontmposolda
authored andcommitted
KEYCLOAK-18954 Add test for user consent retrieval with offline access consents
Signed-off-by: Thomas Darimont <[email protected]>
1 parent f16eb4d commit a7fd1bc

File tree

1 file changed

+65
-0
lines changed
  • testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin

1 file changed

+65
-0
lines changed

testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/ConsentsTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.keycloak.events.Details;
3333
import org.keycloak.events.Errors;
3434
import org.keycloak.representations.idm.ClientRepresentation;
35+
import org.keycloak.representations.idm.ClientScopeRepresentation;
3536
import org.keycloak.representations.idm.EventRepresentation;
3637
import org.keycloak.representations.idm.IdentityProviderRepresentation;
3738
import org.keycloak.representations.idm.RealmRepresentation;
@@ -51,13 +52,17 @@
5152
import java.util.Map;
5253

5354
import static org.junit.Assert.assertEquals;
55+
import static org.junit.Assert.assertFalse;
56+
import static org.junit.Assert.assertNotNull;
57+
import static org.junit.Assert.assertTrue;
5458
import static org.keycloak.testsuite.AbstractTestRealmKeycloakTest.TEST_REALM_NAME;
5559
import static org.keycloak.testsuite.admin.AbstractAdminTest.loadJson;
5660
import static org.keycloak.testsuite.admin.ApiUtil.createUserWithAdminClient;
5761
import static org.keycloak.testsuite.admin.ApiUtil.findClientByClientId;
5862
import static org.keycloak.testsuite.admin.ApiUtil.resetUserPassword;
5963
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude;
6064
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer;
65+
import org.keycloak.testsuite.util.OAuthClient;
6166
import org.keycloak.testsuite.util.OAuthClient.AccessTokenResponse;
6267
import org.keycloak.testsuite.util.OAuthClient.AuthorizationEndpointResponse;
6368

@@ -336,6 +341,66 @@ public void testConsents() {
336341
Assert.assertEquals("There should be no client in user session", 0, sessions.get(0).getClients().size());
337342
}
338343

344+
/**
345+
* KEYCLOAK-18954
346+
*/
347+
@Test
348+
@AuthServerContainerExclude(AuthServer.REMOTE)
349+
public void testRetrieveConsentsForUserWithClientsWithGrantedOfflineAccess() throws Exception {
350+
351+
RealmResource providerRealm = adminClient.realm(providerRealmName());
352+
353+
RealmRepresentation providerRealmRep = providerRealm.toRepresentation();
354+
providerRealmRep.setAccountTheme("keycloak");
355+
providerRealm.update(providerRealmRep);
356+
357+
ClientRepresentation providerAccountRep = providerRealm.clients().findByClientId("account").get(0);
358+
359+
// add offline_scope to default account-console client scope
360+
ClientScopeRepresentation offlineAccessScope = providerRealm.getDefaultOptionalClientScopes().stream()
361+
.filter(csr -> csr.getName().equals(OAuth2Constants.OFFLINE_ACCESS)).findFirst().get();
362+
providerRealm.clients().get(providerAccountRep.getId()).removeOptionalClientScope(offlineAccessScope.getId());
363+
providerRealm.clients().get(providerAccountRep.getId()).addDefaultClientScope(offlineAccessScope.getId());
364+
365+
// enable consent required to explicitly grant offline access
366+
providerAccountRep.setConsentRequired(true);
367+
providerAccountRep.setDirectAccessGrantsEnabled(true); // for offline token retrieval
368+
providerRealm.clients().get(providerAccountRep.getId()).update(providerAccountRep);
369+
370+
List<UserRepresentation> searchResult = providerRealm.users().search(getUserLogin());
371+
UserRepresentation user = searchResult.get(0);
372+
373+
driver.navigate().to(getAccountUrl(providerRealmName()));
374+
375+
waitForPage("Sign in to provider");
376+
log.debug("Logging in");
377+
accountLoginPage.login(getUserLogin(), getUserPassword());
378+
379+
waitForPage("grant access");
380+
log.debug("Grant consent for offline_access");
381+
Assert.assertTrue(consentPage.isCurrent());
382+
consentPage.confirm();
383+
384+
waitForPage("keycloak account console");
385+
386+
// disable consent required again to enable direct grant token retrieval.
387+
providerAccountRep.setConsentRequired(false);
388+
providerRealm.clients().get(providerAccountRep.getId()).update(providerAccountRep);
389+
390+
log.debug("Obtain offline_token");
391+
OAuthClient.AccessTokenResponse response = oauth.realm(providerRealmRep.getRealm())
392+
.clientId(providerAccountRep.getClientId())
393+
.scope(OAuth2Constants.SCOPE_OPENID +" " + OAuth2Constants.SCOPE_PROFILE + " " + OAuth2Constants.OFFLINE_ACCESS)
394+
.doGrantAccessTokenRequest(null, getUserLogin(), getUserPassword());
395+
assertNotNull(response.getRefreshToken());
396+
397+
log.debug("Check for Offline Token in consents");
398+
List<Map<String, Object>> consents = providerRealm.users().get(user.getId()).getConsents();
399+
assertFalse("Consents should not be empty", consents.isEmpty());
400+
401+
assertTrue(consents.toString().contains("Offline Token"));
402+
}
403+
339404
@Test
340405
public void testConsentCancel() {
341406
// setup account client to require consent

0 commit comments

Comments
 (0)