Skip to content

Commit 6498895

Browse files
authored
Merge pull request #45588 from sberyozkin/oidc_db_access_token_expires_in
Update OIDC DB TokenStateManager to keep access token expires_in
2 parents 39af742 + 185e327 commit 6498895

File tree

6 files changed

+45
-13
lines changed

6 files changed

+45
-13
lines changed

extensions/oidc-db-token-state-manager/deployment/src/main/java/io/quarkus/oidc/db/token/state/manager/OidcDbTokenStateManagerProcessor.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,29 @@ SyntheticBeanBuildItem produceDbTokenStateManagerBean(OidcDbTokenStateManagerRec
4444
final String[] queryParamPlaceholders;
4545
switch (sqlClientBuildItem.reactiveClient) {
4646
case REACTIVE_PG_CLIENT:
47-
queryParamPlaceholders = new String[] { "$1", "$2", "$3", "$4", "$5" };
47+
queryParamPlaceholders = new String[] { "$1", "$2", "$3", "$4", "$5", "$6" };
4848
break;
4949
case REACTIVE_MSSQL_CLIENT:
50-
queryParamPlaceholders = new String[] { "@p1", "@p2", "@p3", "@p4", "@p5" };
50+
queryParamPlaceholders = new String[] { "@p1", "@p2", "@p3", "@p4", "@p5", "@p6" };
5151
break;
5252
case REACTIVE_MYSQL_CLIENT:
5353
case REACTIVE_DB2_CLIENT:
5454
case REACTIVE_ORACLE_CLIENT:
55-
queryParamPlaceholders = new String[] { "?", "?", "?", "?", "?" };
55+
queryParamPlaceholders = new String[] { "?", "?", "?", "?", "?", "?" };
5656
break;
5757
default:
5858
throw new RuntimeException("Unknown Reactive Sql Client " + sqlClientBuildItem.reactiveClient);
5959
}
6060
String deleteStatement = format("DELETE FROM oidc_db_token_state_manager WHERE id = %s", queryParamPlaceholders[0]);
61-
String getQuery = format("SELECT id_token, access_token, refresh_token FROM oidc_db_token_state_manager WHERE " +
62-
"id = %s", queryParamPlaceholders[0]);
61+
String getQuery = format(
62+
"SELECT id_token, access_token, refresh_token, access_token_expires_in FROM oidc_db_token_state_manager WHERE "
63+
+
64+
"id = %s",
65+
queryParamPlaceholders[0]);
6366
String insertStatement = format("INSERT INTO oidc_db_token_state_manager (id_token, access_token, refresh_token," +
64-
" expires_in, id) VALUES (%s, %s, %s, %s, %s)", queryParamPlaceholders[0], queryParamPlaceholders[1],
65-
queryParamPlaceholders[2], queryParamPlaceholders[3], queryParamPlaceholders[4]);
67+
" access_token_expires_in, expires_in, id) VALUES (%s, %s, %s, %s, %s, %s)", queryParamPlaceholders[0],
68+
queryParamPlaceholders[1],
69+
queryParamPlaceholders[2], queryParamPlaceholders[3], queryParamPlaceholders[4], queryParamPlaceholders[5]);
6670
return SyntheticBeanBuildItem
6771
.configure(OidcDbTokenStateManager.class)
6872
.alternative(true)
@@ -114,6 +118,7 @@ SyntheticBeanBuildItem createDbTokenStateInitializerProps(ReactiveSqlClientBuild
114118
"id_token VARCHAR, " +
115119
"access_token VARCHAR, " +
116120
"refresh_token VARCHAR, " +
121+
"access_token_expires_in BIGINT, " +
117122
"expires_in BIGINT NOT NULL)";
118123
supportsIfTableNotExists = true;
119124
break;
@@ -123,6 +128,7 @@ SyntheticBeanBuildItem createDbTokenStateInitializerProps(ReactiveSqlClientBuild
123128
+ "id_token VARCHAR(5000) NULL, "
124129
+ "access_token VARCHAR(5000) NULL, "
125130
+ "refresh_token VARCHAR(5000) NULL, "
131+
+ "access_token_expires_in BIGINT NULL, "
126132
+ "expires_in BIGINT NOT NULL, "
127133
+ "PRIMARY KEY (id))";
128134
supportsIfTableNotExists = true;
@@ -133,6 +139,7 @@ SyntheticBeanBuildItem createDbTokenStateInitializerProps(ReactiveSqlClientBuild
133139
+ "id_token NVARCHAR(MAX), "
134140
+ "access_token NVARCHAR(MAX), "
135141
+ "refresh_token NVARCHAR(MAX), "
142+
+ "access_token_expires_in BIGINT, "
136143
+ "expires_in BIGINT NOT NULL)";
137144
supportsIfTableNotExists = false;
138145
break;
@@ -142,6 +149,7 @@ SyntheticBeanBuildItem createDbTokenStateInitializerProps(ReactiveSqlClientBuild
142149
+ "id_token VARCHAR(4000), "
143150
+ "access_token VARCHAR(4000), "
144151
+ "refresh_token VARCHAR(4000), "
152+
+ "access_token_expires_in BIGINT, "
145153
+ "expires_in BIGINT NOT NULL)";
146154
supportsIfTableNotExists = false;
147155
break;
@@ -151,6 +159,7 @@ SyntheticBeanBuildItem createDbTokenStateInitializerProps(ReactiveSqlClientBuild
151159
+ "id_token VARCHAR2(4000), "
152160
+ "access_token VARCHAR2(4000), "
153161
+ "refresh_token VARCHAR2(4000), "
162+
+ "access_token_expires_in NUMBER, "
154163
+ "expires_in NUMBER NOT NULL, "
155164
+ "PRIMARY KEY (id))";
156165
supportsIfTableNotExists = true;

extensions/oidc-db-token-state-manager/deployment/src/test/java/io/quarkus/oidc/db/token/state/manager/AbstractDbTokenStateManagerTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public void testCodeFlow() throws IOException {
7070

7171
textPage = loginForm.getButtonByName("login").click();
7272

73-
assertEquals("alice", textPage.getContent());
73+
assertEquals("alice, access token: true, access_token_expires_in: true, refresh_token: true",
74+
textPage.getContent());
7475

7576
assertTokenStateCount(1);
7677

extensions/oidc-db-token-state-manager/deployment/src/test/java/io/quarkus/oidc/db/token/state/manager/OidcDbTokenStateManagerEntity.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public class OidcDbTokenStateManagerEntity {
2121
@Column(name = "access_token", length = 4000)
2222
String accessToken;
2323

24+
@Column(name = "access_token_expires_in")
25+
Long accessTokenExpiresIn;
26+
2427
@Column(name = "expires_in")
2528
Long expiresIn;
2629
}

extensions/oidc-db-token-state-manager/deployment/src/test/java/io/quarkus/oidc/db/token/state/manager/OidcDbTokenStateManagerResource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void create(Long numOfTokens) {
2626
token.idToken = "ID TOKEN " + i;
2727
token.accessToken = "ACCESS TOKEN " + i;
2828
token.refreshToken = "REFRESH TOKEN " + i;
29+
token.accessTokenExpiresIn = 10L + i;
2930
token.expiresIn = expiresIn5Sec;
3031
token.id = UUID.randomUUID().toString() + Instant.now().getEpochSecond();
3132
em.persist(token);

extensions/oidc-db-token-state-manager/deployment/src/test/java/io/quarkus/oidc/db/token/state/manager/ProtectedResource.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import org.eclipse.microprofile.jwt.JsonWebToken;
88

9+
import io.quarkus.oidc.AuthorizationCodeTokens;
910
import io.quarkus.oidc.IdToken;
1011
import io.quarkus.security.Authenticated;
12+
import io.vertx.ext.web.RoutingContext;
1113

1214
@Path("/protected")
1315
@Authenticated
@@ -17,9 +19,17 @@ public class ProtectedResource {
1719
@IdToken
1820
JsonWebToken idToken;
1921

22+
@Inject
23+
RoutingContext context;
24+
2025
@GET
2126
public String getName() {
22-
return idToken.getName();
27+
AuthorizationCodeTokens tokens = context.get(AuthorizationCodeTokens.class.getName());
28+
return idToken.getName()
29+
+ ", access token: " + (tokens.getAccessToken() != null)
30+
+ ", access_token_expires_in: " + (tokens.getAccessTokenExpiresIn() != null)
31+
+ ", refresh_token: " + (tokens.getRefreshToken() != null);
32+
2333
}
2434

2535
@GET

extensions/oidc-db-token-state-manager/runtime/src/main/java/io/quarkus/oidc/db/token/state/manager/runtime/OidcDbTokenStateManager.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ public class OidcDbTokenStateManager implements TokenStateManager {
2727
private static final Logger LOG = Logger.getLogger(OidcDbTokenStateManager.class);
2828
private static final String TOKEN_STATE_INSERT_FAILED = "Failed to insert token state into database";
2929
private static final String FAILED_TO_ACQUIRE_TOKEN = "Failed to acquire authorization code tokens";
30+
31+
private static final String ID_TOKEN_COLUMN = "id_token";
32+
private static final String ACCESS_TOKEN_COLUMN = "access_token";
33+
private static final String ACCESS_TOKEN_EXPIRES_IN_COLUMN = "access_token_expires_in";
34+
private static final String REFRESH_TOKEN_COLUMN = "refresh_token";
35+
3036
private final String insertStatement;
3137
private final String deleteStatement;
3238
private final String getQuery;
@@ -54,7 +60,8 @@ public Uni<String> createTokenState(RoutingContext event, OidcTenantConfig oidcC
5460
.preparedQuery(insertStatement)
5561
.execute(
5662
Tuple.of(tokens.getIdToken(), tokens.getAccessToken(),
57-
tokens.getRefreshToken(), expiresIn(event), id)))
63+
tokens.getRefreshToken(), tokens.getAccessTokenExpiresIn(),
64+
expiresIn(event), id)))
5865
.toCompletionStage())
5966
.onFailure().transform(new Function<Throwable, Throwable>() {
6067
@Override
@@ -100,9 +107,10 @@ public Uni<? extends AuthorizationCodeTokens> apply(RowSet<Row> rows) {
100107
return Uni
101108
.createFrom()
102109
.item(new AuthorizationCodeTokens(
103-
firstRow.getString("id_token"),
104-
firstRow.getString("access_token"),
105-
firstRow.getString("refresh_token")));
110+
firstRow.getString(ID_TOKEN_COLUMN),
111+
firstRow.getString(ACCESS_TOKEN_COLUMN),
112+
firstRow.getString(REFRESH_TOKEN_COLUMN),
113+
firstRow.getLong(ACCESS_TOKEN_EXPIRES_IN_COLUMN)));
106114
}
107115
}
108116
return Uni.createFrom().failure(new AuthenticationCompletionException(FAILED_TO_ACQUIRE_TOKEN));

0 commit comments

Comments
 (0)