1
1
package com .bfwg .security ;
2
2
3
+ import com .bfwg .common .TimeProvider ;
3
4
import io .jsonwebtoken .Claims ;
4
5
import io .jsonwebtoken .Jwts ;
5
6
import io .jsonwebtoken .SignatureAlgorithm ;
6
- import org .joda .time .DateTime ;
7
7
import org .springframework .beans .factory .annotation .Autowired ;
8
8
import org .springframework .beans .factory .annotation .Value ;
9
- import org .springframework .security .core .userdetails .UserDetailsService ;
9
+ import org .springframework .mobile .device .Device ;
10
+ import org .springframework .security .core .userdetails .UserDetails ;
10
11
import org .springframework .stereotype .Component ;
11
12
12
13
import javax .servlet .http .Cookie ;
13
14
import javax .servlet .http .HttpServletRequest ;
14
15
import java .util .Date ;
15
- import java .util .Map ;
16
- import java .util .function .Function ;
17
16
18
17
19
18
/**
@@ -32,74 +31,133 @@ public class TokenHelper {
32
31
@ Value ("${jwt.expires_in}" )
33
32
private long EXPIRES_IN ;
34
33
34
+ @ Value ("${jwt.mobile_expires_in}" )
35
+ private long MOBILE_EXPIRES_IN ;
36
+
35
37
@ Value ("${jwt.header}" )
36
38
private String AUTH_HEADER ;
37
39
38
40
@ Value ("${jwt.cookie}" )
39
41
private String AUTH_COOKIE ;
40
42
43
+ static final String AUDIENCE_UNKNOWN = "unknown" ;
44
+ static final String AUDIENCE_WEB = "web" ;
45
+ static final String AUDIENCE_MOBILE = "mobile" ;
46
+ static final String AUDIENCE_TABLET = "tablet" ;
47
+
41
48
@ Autowired
42
- UserDetailsService userDetailsService ;
49
+ TimeProvider timeProvider ;
43
50
44
51
private SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm .HS512 ;
45
52
46
53
public String getUsernameFromToken (String token ) {
47
- return getClaimsFromToken (token , Claims ::getSubject );
54
+ String username ;
55
+ try {
56
+ final Claims claims = this .getAllClaimsFromToken (token );
57
+ username = claims .getSubject ();
58
+ } catch (Exception e ) {
59
+ username = null ;
60
+ }
61
+ return username ;
48
62
}
49
63
50
- public Boolean canTokenBeRefreshed (String token ) {
51
- final Date expirationDate = getClaimsFromToken (token , Claims ::getExpiration );
52
- return expirationDate .compareTo (generateCurrentDate ()) > 0 ;
64
+ public Date getIssuedAtDateFromToken (String token ) {
65
+ Date issueAt ;
66
+ try {
67
+ final Claims claims = this .getAllClaimsFromToken (token );
68
+ issueAt = claims .getIssuedAt ();
69
+ } catch (Exception e ) {
70
+ issueAt = null ;
71
+ }
72
+ return issueAt ;
73
+ }
74
+
75
+ public String getAudienceFromToken (String token ) {
76
+ String audience ;
77
+ try {
78
+ final Claims claims = this .getAllClaimsFromToken (token );
79
+ audience = claims .getAudience ();
80
+ } catch (Exception e ) {
81
+ audience = null ;
82
+ }
83
+ return audience ;
53
84
}
54
85
55
- public String refreshToken (String token ) {
56
- final Claims claims = getAllClaimsFromToken (token );
57
- claims .setIssuedAt (generateCurrentDate ());
58
- return generateToken (claims );
86
+ public String refreshToken (String token , Device device ) {
87
+ String refreshedToken ;
88
+ try {
89
+ final Claims claims = this .getAllClaimsFromToken (token );
90
+ claims .setIssuedAt (timeProvider .now ());
91
+ refreshedToken = Jwts .builder ()
92
+ .setClaims (claims )
93
+ .setExpiration (generateExpirationDate (device ))
94
+ .signWith ( SIGNATURE_ALGORITHM , SECRET )
95
+ .compact ();
96
+ } catch (Exception e ) {
97
+ refreshedToken = null ;
98
+ }
99
+ return refreshedToken ;
59
100
}
60
101
61
- public String generateToken (String username ) {
102
+ public String generateToken (String username , Device device ) {
103
+ String audience = generateAudience (device );
62
104
return Jwts .builder ()
63
105
.setIssuer ( APP_NAME )
64
106
.setSubject (username )
65
- .setIssuedAt (generateCurrentDate ())
66
- .setExpiration (generateExpirationDate ())
107
+ .setAudience (audience )
108
+ .setIssuedAt (timeProvider .now ())
109
+ .setExpiration (generateExpirationDate (device ))
67
110
.signWith ( SIGNATURE_ALGORITHM , SECRET )
68
111
.compact ();
69
112
}
70
113
71
-
72
- private <T > T getClaimsFromToken (String token , Function <Claims , T > claimsResolver ) {
73
- Claims claims = getAllClaimsFromToken (token );
74
- return claimsResolver .apply (claims );
114
+ private String generateAudience (Device device ) {
115
+ String audience = AUDIENCE_UNKNOWN ;
116
+ if (device .isNormal ()) {
117
+ audience = AUDIENCE_WEB ;
118
+ } else if (device .isTablet ()) {
119
+ audience = AUDIENCE_TABLET ;
120
+ } else if (device .isMobile ()) {
121
+ audience = AUDIENCE_MOBILE ;
122
+ }
123
+ return audience ;
75
124
}
76
125
77
126
private Claims getAllClaimsFromToken (String token ) {
78
- return Jwts .parser ()
79
- .setSigningKey (SECRET )
80
- .parseClaimsJws (token )
81
- .getBody ();
82
- }
83
-
84
- String generateToken (Map <String , Object > claims ) {
85
- return Jwts .builder ()
86
- .setClaims (claims )
87
- .setExpiration (generateExpirationDate ())
88
- .signWith ( SIGNATURE_ALGORITHM , SECRET )
89
- .compact ();
127
+ Claims claims ;
128
+ try {
129
+ claims = Jwts .parser ()
130
+ .setSigningKey (SECRET )
131
+ .parseClaimsJws (token )
132
+ .getBody ();
133
+ } catch (Exception e ) {
134
+ claims = null ;
135
+ }
136
+ return claims ;
90
137
}
91
138
92
- private long getCurrentTimeMillis () {
93
- return DateTime .now ().getMillis ();
139
+ private Date generateExpirationDate (Device device ) {
140
+ long expiresIn = device .isTablet () || device .isMobile () ? MOBILE_EXPIRES_IN : EXPIRES_IN ;
141
+ return new Date (timeProvider .now ().getTime () + expiresIn * 1000 );
94
142
}
95
143
96
- private Date generateCurrentDate () {
97
- return new Date (getCurrentTimeMillis ());
144
+ public Boolean canTokenBeRefreshed (String token ) {
145
+ final Date created = getIssuedAtDateFromToken (token );
146
+ if (created == null ) {
147
+ return false ;
148
+ } else {
149
+ return true ;
150
+ }
98
151
}
99
152
100
- private Date generateExpirationDate () {
101
-
102
- return new Date (getCurrentTimeMillis () + this .EXPIRES_IN * 1000 );
153
+ public Boolean validateToken (String token , UserDetails userDetails ) {
154
+ final String username = getUsernameFromToken (token );
155
+ // final Date created = getIssuedAtDateFromToken(token);
156
+ return (
157
+ username != null &&
158
+ username .equals (userDetails .getUsername ())
159
+ // && !isCreatedBeforeLastPasswordReset(created, user.getLastPasswordResetDate())
160
+ );
103
161
}
104
162
105
163
public String getToken ( HttpServletRequest request ) {
0 commit comments