Skip to content

Commit ccab7de

Browse files
vishwab1claude
andauthored
fix(security): remove PII from JWT token for mobile logins (#413)
Add generateSecureToken/generateSecureRefreshToken methods that use userId as sub instead of username. Mobile logins (okhttp User-Agent) use the secure token — web logins remain unchanged for backward compatibility. Other services will be migrated one by one. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent c82c9ad commit ccab7de

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

src/main/java/com/iemr/common/controller/users/IEMRAdminController.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,10 @@ public String userAuthenticate(
193193
String jwtToken = null;
194194
String refreshToken = null;
195195
if (mUser.size() == 1) {
196-
jwtToken = jwtUtil.generateToken(m_User.getUserName(), mUser.get(0).getUserID().toString());
196+
String userIdStr = mUser.get(0).getUserID().toString();
197+
jwtToken = isMobile
198+
? jwtUtil.generateSecureToken(userIdStr)
199+
: jwtUtil.generateToken(m_User.getUserName(), userIdStr);
197200

198201
User user = new User(); // Assuming the Users class exists
199202
user.setUserID(mUser.get(0).getUserID());
@@ -209,7 +212,7 @@ public String userAuthenticate(
209212
);
210213

211214
if (isMobile) {
212-
refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString());
215+
refreshToken = jwtUtil.generateSecureRefreshToken(user.getUserID().toString());
213216
logger.debug("Refresh token generated successfully for user: {}", user.getUserName());
214217
String jti = jwtUtil.getJtiFromToken(refreshToken);
215218
redisTemplate.opsForValue().set(
@@ -555,7 +558,7 @@ public String superUserAuthenticate(
555558
);
556559

557560
if (isMobile) {
558-
refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString());
561+
refreshToken = jwtUtil.generateSecureRefreshToken(user.getUserID().toString());
559562
logger.debug("Refresh token generated successfully for user: {}", user.getUserName());
560563
String jti = jwtUtil.getJtiFromToken(refreshToken);
561564
redisTemplate.opsForValue().set(

src/main/java/com/iemr/common/utils/JwtUtil.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,27 @@ public String generateToken(String username, String userId) {
4646
return buildToken(username, userId, "access", ACCESS_EXPIRATION_TIME);
4747
}
4848

49+
// Mobile login: token without PII in sub
50+
public String generateSecureToken(String userId) {
51+
return buildSecureToken(userId, "access", ACCESS_EXPIRATION_TIME);
52+
}
53+
54+
public String generateSecureRefreshToken(String userId) {
55+
return buildSecureToken(userId, "refresh", REFRESH_EXPIRATION_TIME);
56+
}
57+
58+
private String buildSecureToken(String userId, String tokenType, long expiration) {
59+
return Jwts.builder()
60+
.subject(userId)
61+
.claim("userId", userId)
62+
.claim("token_type", tokenType)
63+
.id(UUID.randomUUID().toString())
64+
.issuedAt(new Date())
65+
.expiration(new Date(System.currentTimeMillis() + expiration))
66+
.signWith(getSigningKey())
67+
.compact();
68+
}
69+
4970
/**
5071
* Generate a refresh token.
5172
*

0 commit comments

Comments
 (0)