Skip to content

Commit 32435f5

Browse files
committed
Added getUserSessionToken()
1 parent 19551f0 commit 32435f5

File tree

8 files changed

+78
-4
lines changed

8 files changed

+78
-4
lines changed

stream-core/src/main/java/io/getstream/client/model/feeds/BaseFeed.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public String getReadOnlyToken() {
4848
return streamRepository.getReadOnlyToken(this);
4949
}
5050

51+
@Override
52+
public String getUserSessionToken() {
53+
return streamRepository.getUserSessionToken(this);
54+
}
55+
5156
@Override
5257
public void follow(String feedSlug, String userId) throws IOException, StreamClientException {
5358
String feedId = String.format("%s:%s", feedSlug, userId);

stream-core/src/main/java/io/getstream/client/model/feeds/Feed.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public interface Feed {
3939
*/
4040
String getReadOnlyToken();
4141

42+
/**
43+
* Generate User Session JWT Token. UserId is taken from {@link Feed#getId()}.
44+
* @return Token
45+
*/
46+
String getUserSessionToken();
47+
4248
/**
4349
* Follows the given target feed.
4450
*

stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public interface StreamRepository {
4848
*/
4949
String getReadOnlyToken(BaseFeed feed);
5050

51+
String getUserSessionToken(BaseFeed feed);
52+
5153
/**
5254
* Follow a feed.
5355
*

stream-core/src/main/java/io/getstream/client/util/JwtAuthenticationUtil.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package io.getstream.client.util;
22

3-
import java.io.UnsupportedEncodingException;
4-
53
import com.auth0.jwt.JWT;
64
import com.auth0.jwt.JWTCreator;
75
import com.auth0.jwt.algorithms.Algorithm;
86

7+
import java.io.UnsupportedEncodingException;
8+
99
/**
1010
* Utility class to generate a JWT token.
1111
*/
@@ -28,8 +28,41 @@ public class JwtAuthenticationUtil {
2828
public static String generateToken(final String secretKey, final String action, final String resource, final String feedId, final String userId) {
2929
JWTCreator.Builder jwtBuilder = JWT.create();
3030

31-
jwtBuilder = jwtBuilder.withClaim("action", action);
32-
jwtBuilder = jwtBuilder.withClaim("resource", resource);
31+
if (null != action) {
32+
jwtBuilder = jwtBuilder.withClaim("action", action);
33+
}
34+
35+
if (null != resource) {
36+
jwtBuilder = jwtBuilder.withClaim("resource", resource);
37+
}
38+
39+
if (null != feedId) {
40+
jwtBuilder = jwtBuilder.withClaim("feed_id", feedId);
41+
}
42+
43+
if (null != userId) {
44+
jwtBuilder = jwtBuilder.withClaim("user_id", userId);
45+
}
46+
47+
try {
48+
Algorithm algorithm = Algorithm.HMAC256(secretKey);
49+
50+
return jwtBuilder.sign(algorithm);
51+
} catch (UnsupportedEncodingException exc) {
52+
throw new IllegalStateException("Fatal error: JWT Algorithm unsupported.");
53+
}
54+
}
55+
56+
/**
57+
* Generate JWT token.
58+
* @param secretKey API Secret
59+
* @param feedId FeedId (if null it will not be added to the payload)
60+
* @param userId UserId (if null it will not be added to the payload)
61+
* @return Token string
62+
*/
63+
public static String generateToken(final String secretKey, final String feedId, final String userId) {
64+
JWTCreator.Builder jwtBuilder = JWT.create();
65+
3366
if (null != feedId) {
3467
jwtBuilder = jwtBuilder.withClaim("feed_id", feedId);
3568
}

stream-repo-apache/src/main/java/io/getstream/client/apache/repo/StreamRepositoryImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ public String getReadOnlyToken(BaseFeed feed) {
8383
return JwtAuthenticationUtil.generateToken(secretKey, "read", "*", feed.getFeedSlug().concat(feed.getUserId()), null);
8484
}
8585

86+
@Override
87+
public String getUserSessionToken(BaseFeed feed) {
88+
return JwtAuthenticationUtil.generateToken(secretKey, null, feed.getUserId());
89+
}
90+
8691
@Override
8792
public void follow(BaseFeed feed, String targetFeedId, int activityCopyLimit) throws StreamClientException, IOException {
8893
HttpPost request = new HttpPost(UriBuilder.fromEndpoint(baseEndpoint)

stream-repo-apache/src/test/java/io/getstream/client/apache/IntegrationTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ public void shouldGetReadOnlyToken() throws IOException, StreamClientException,
7878
assertThat(map.get("resource").asString(), is(ALL));
7979
}
8080

81+
@Test
82+
public void shouldGetUserSessionToken() throws StreamClientException {
83+
StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY, API_SECRET);
84+
Feed feed = streamClient.newFeed("feedslug", "aUserId");
85+
86+
Map<String, Claim> map = verifyToken(feed.getUserSessionToken());
87+
assertThat(map.get("user_id").asString(), is("aUserId"));
88+
}
89+
8190
@Test
8291
public void shouldGetFollowers() throws IOException, StreamClientException {
8392
StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY,

stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/repo/StreamRepositoryImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public String getToken(BaseFeed feed) {
8686
return StreamRepoUtils.createFeedToken(feed, secretKey);
8787
}
8888

89+
@Override
90+
public String getUserSessionToken(BaseFeed feed) {
91+
return JwtAuthenticationUtil.generateToken(secretKey, null, feed.getUserId());
92+
}
93+
8994
@Override
9095
public void follow(BaseFeed feed, String targetFeedId, int activityCopyLimit) throws StreamClientException, IOException {
9196
Request.Builder requestBuilder = new Request.Builder().url(UriBuilder.fromEndpoint(baseEndpoint)

stream-repo-okhttp/src/test/java/io/getstream/client/okhttp/IntegrationTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ public void shouldGetReadOnlyToken() throws StreamClientException {
6868
assertThat(map.get("resource").asString(), is(ALL));
6969
}
7070

71+
@Test
72+
public void shouldGetUserSessionToken() throws StreamClientException {
73+
StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY, API_SECRET);
74+
Feed feed = streamClient.newFeed("feedslug", "aUserId");
75+
76+
Map<String, Claim> map = verifyToken(feed.getUserSessionToken());
77+
assertThat(map.get("user_id").asString(), is("aUserId"));
78+
}
79+
7180
@Test
7281
public void shouldGetFollowers() throws IOException, StreamClientException {
7382
StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY,

0 commit comments

Comments
 (0)