diff --git a/stream-core/src/main/java/io/getstream/client/StreamClient.java b/stream-core/src/main/java/io/getstream/client/StreamClient.java index 5265c611..a83dc829 100644 --- a/stream-core/src/main/java/io/getstream/client/StreamClient.java +++ b/stream-core/src/main/java/io/getstream/client/StreamClient.java @@ -31,6 +31,14 @@ public interface StreamClient { */ PersonalizedFeed newPersonalizedFeed(String feedSlug, String id) throws InvalidFeedNameException; + + /** + * Generate User Session JWT Token. + * @param userId User identifier + * @return JWT Token + */ + String getUserSessionToken(String userId); + /** * Send the shutdown signal to the client. * diff --git a/stream-core/src/main/java/io/getstream/client/model/feeds/BaseFeed.java b/stream-core/src/main/java/io/getstream/client/model/feeds/BaseFeed.java index b49982ed..b6f14ae2 100644 --- a/stream-core/src/main/java/io/getstream/client/model/feeds/BaseFeed.java +++ b/stream-core/src/main/java/io/getstream/client/model/feeds/BaseFeed.java @@ -48,11 +48,6 @@ public String getReadOnlyToken() { return streamRepository.getReadOnlyToken(this); } - @Override - public String getUserSessionToken() { - return streamRepository.getUserSessionToken(this); - } - @Override public void follow(String feedSlug, String userId) throws IOException, StreamClientException { String feedId = String.format("%s:%s", feedSlug, userId); diff --git a/stream-core/src/main/java/io/getstream/client/model/feeds/Feed.java b/stream-core/src/main/java/io/getstream/client/model/feeds/Feed.java index 95ac1986..fe429d92 100644 --- a/stream-core/src/main/java/io/getstream/client/model/feeds/Feed.java +++ b/stream-core/src/main/java/io/getstream/client/model/feeds/Feed.java @@ -39,12 +39,6 @@ public interface Feed { */ String getReadOnlyToken(); - /** - * Generate User Session JWT Token. UserId is taken from {@link Feed#getId()}. - * @return Token - */ - String getUserSessionToken(); - /** * Follows the given target feed. * diff --git a/stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java b/stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java index 2a7b62be..33c3f687 100644 --- a/stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java +++ b/stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java @@ -48,8 +48,6 @@ public interface StreamRepository { */ String getReadOnlyToken(BaseFeed feed); - String getUserSessionToken(BaseFeed feed); - /** * Follow a feed. * diff --git a/stream-repo-apache/src/main/java/io/getstream/client/apache/StreamClientImpl.java b/stream-repo-apache/src/main/java/io/getstream/client/apache/StreamClientImpl.java index 9c12d728..1b71485f 100644 --- a/stream-repo-apache/src/main/java/io/getstream/client/apache/StreamClientImpl.java +++ b/stream-repo-apache/src/main/java/io/getstream/client/apache/StreamClientImpl.java @@ -20,6 +20,7 @@ import io.getstream.client.repo.StreamPersonalizedRepository; import io.getstream.client.repo.StreamRepository; import io.getstream.client.util.InfoUtil; +import io.getstream.client.util.JwtAuthenticationUtil; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; @@ -39,6 +40,8 @@ public class StreamClientImpl implements StreamClient { private FeedFactory feedFactory; private final StreamRepository streamRepository; private final Optional streamPersonalizedRepository; + private final String apiKey; + private final String secretKey; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES) @@ -46,6 +49,9 @@ public class StreamClientImpl implements StreamClient { .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); public StreamClientImpl(final ClientConfiguration clientConfiguration, final String key, final String secretKey) { + this.apiKey = key; + this.secretKey = secretKey; + Preconditions.checkNotNull(clientConfiguration, "Client configuration cannot be null."); AuthenticationHandlerConfiguration authenticationHandlerConfiguration = new AuthenticationHandlerConfiguration(); authenticationHandlerConfiguration.setApiKey(checkNotNull(key, "API key cannot be null.")); @@ -70,6 +76,11 @@ public PersonalizedFeed newPersonalizedFeed(final String feedSlug, return this.feedFactory.createPersonalizedFeed(feedSlug, id); } + @Override + public String getUserSessionToken(String userId) { + return JwtAuthenticationUtil.generateToken(getSecretKey(), null, userId); + } + @Override public void shutdown() throws IOException { this.streamRepository.shutdown(); @@ -123,4 +134,12 @@ private CloseableHttpClient initClient(final ClientConfiguration config, public static ObjectMapper getObjectMapper() { return OBJECT_MAPPER; } + + public String getApiKey() { + return apiKey; + } + + public String getSecretKey() { + return secretKey; + } } \ No newline at end of file diff --git a/stream-repo-apache/src/main/java/io/getstream/client/apache/repo/StreamRepositoryImpl.java b/stream-repo-apache/src/main/java/io/getstream/client/apache/repo/StreamRepositoryImpl.java index 9169e534..ed03e069 100644 --- a/stream-repo-apache/src/main/java/io/getstream/client/apache/repo/StreamRepositoryImpl.java +++ b/stream-repo-apache/src/main/java/io/getstream/client/apache/repo/StreamRepositoryImpl.java @@ -83,11 +83,6 @@ public String getReadOnlyToken(BaseFeed feed) { return JwtAuthenticationUtil.generateToken(secretKey, "read", "*", feed.getFeedSlug().concat(feed.getUserId()), null); } - @Override - public String getUserSessionToken(BaseFeed feed) { - return JwtAuthenticationUtil.generateToken(secretKey, null, feed.getUserId()); - } - @Override public void follow(BaseFeed feed, String targetFeedId, int activityCopyLimit) throws StreamClientException, IOException { HttpPost request = new HttpPost(UriBuilder.fromEndpoint(baseEndpoint) diff --git a/stream-repo-apache/src/test/java/io/getstream/client/apache/IntegrationTest.java b/stream-repo-apache/src/test/java/io/getstream/client/apache/IntegrationTest.java index b2d40f7b..d74fb508 100644 --- a/stream-repo-apache/src/test/java/io/getstream/client/apache/IntegrationTest.java +++ b/stream-repo-apache/src/test/java/io/getstream/client/apache/IntegrationTest.java @@ -81,9 +81,7 @@ public void shouldGetReadOnlyToken() throws IOException, StreamClientException, @Test public void shouldGetUserSessionToken() throws StreamClientException { StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY, API_SECRET); - Feed feed = streamClient.newFeed("feedslug", "aUserId"); - - Map map = verifyToken(feed.getUserSessionToken()); + Map map = verifyToken(streamClient.getUserSessionToken("aUserId")); assertThat(map.get("user_id").asString(), is("aUserId")); } diff --git a/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/StreamClientImpl.java b/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/StreamClientImpl.java index a6edbe30..39386308 100644 --- a/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/StreamClientImpl.java +++ b/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/StreamClientImpl.java @@ -1,11 +1,5 @@ package io.getstream.client.okhttp; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.TimeUnit; - import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; @@ -26,11 +20,18 @@ import io.getstream.client.repo.StreamPersonalizedRepository; import io.getstream.client.repo.StreamRepository; import io.getstream.client.util.InfoUtil; +import io.getstream.client.util.JwtAuthenticationUtil; import okhttp3.ConnectionPool; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Response; +import java.io.IOException; +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +import static com.google.common.base.Preconditions.checkNotNull; + public class StreamClientImpl implements StreamClient { private static final String USER_AGENT_PREFIX = "stream-java-okhttp-%s"; @@ -38,6 +39,8 @@ public class StreamClientImpl implements StreamClient { private final Optional streamPersonalizedRepository; private FeedFactory feedFactory; private final StreamRepository streamRepository; + private final String apiKey; + private final String secretKey; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES) @@ -45,6 +48,9 @@ public class StreamClientImpl implements StreamClient { .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); public StreamClientImpl(final ClientConfiguration clientConfiguration, final String key, final String secretKey) { + this.apiKey = key; + this.secretKey = secretKey; + Preconditions.checkNotNull(clientConfiguration, "Client configuration cannot be null."); AuthenticationHandlerConfiguration authenticationHandlerConfiguration = new AuthenticationHandlerConfiguration(); authenticationHandlerConfiguration.setApiKey(checkNotNull(key, "API key cannot be null.")); @@ -69,6 +75,11 @@ public PersonalizedFeed newPersonalizedFeed(final String feedSlug, return this.feedFactory.createPersonalizedFeed(feedSlug, id); } + @Override + public String getUserSessionToken(String userId) { + return JwtAuthenticationUtil.generateToken(getSecretKey(), null, userId); + } + @Override public void shutdown() throws IOException { this.streamRepository.shutdown(); @@ -124,4 +135,12 @@ private String getUserAgent() { public static ObjectMapper getObjectMapper() { return OBJECT_MAPPER; } + + public String getApiKey() { + return apiKey; + } + + public String getSecretKey() { + return secretKey; + } } \ No newline at end of file diff --git a/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/repo/StreamRepositoryImpl.java b/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/repo/StreamRepositoryImpl.java index de901ceb..a1d4f65f 100644 --- a/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/repo/StreamRepositoryImpl.java +++ b/stream-repo-okhttp/src/main/java/io/getstream/client/okhttp/repo/StreamRepositoryImpl.java @@ -86,11 +86,6 @@ public String getToken(BaseFeed feed) { return StreamRepoUtils.createFeedToken(feed, secretKey); } - @Override - public String getUserSessionToken(BaseFeed feed) { - return JwtAuthenticationUtil.generateToken(secretKey, null, feed.getUserId()); - } - @Override public void follow(BaseFeed feed, String targetFeedId, int activityCopyLimit) throws StreamClientException, IOException { Request.Builder requestBuilder = new Request.Builder().url(UriBuilder.fromEndpoint(baseEndpoint) diff --git a/stream-repo-okhttp/src/test/java/io/getstream/client/okhttp/IntegrationTest.java b/stream-repo-okhttp/src/test/java/io/getstream/client/okhttp/IntegrationTest.java index 9d6949b6..3c151849 100644 --- a/stream-repo-okhttp/src/test/java/io/getstream/client/okhttp/IntegrationTest.java +++ b/stream-repo-okhttp/src/test/java/io/getstream/client/okhttp/IntegrationTest.java @@ -71,9 +71,7 @@ public void shouldGetReadOnlyToken() throws StreamClientException { @Test public void shouldGetUserSessionToken() throws StreamClientException { StreamClient streamClient = new StreamClientImpl(CLIENT_CONFIGURATION, API_KEY, API_SECRET); - Feed feed = streamClient.newFeed("feedslug", "aUserId"); - - Map map = verifyToken(feed.getUserSessionToken()); + Map map = verifyToken(streamClient.getUserSessionToken("aUserId")); assertThat(map.get("user_id").asString(), is("aUserId")); }