Skip to content

Commit f3214ea

Browse files
authored
Drop signing and use JWT (#35)
1 parent 6fbe39b commit f3214ea

File tree

11 files changed

+35
-138
lines changed

11 files changed

+35
-138
lines changed

src/stream-net-tests/IntegrationTests.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,11 +1225,8 @@ public async Task TestAggregate()
12251225
var response = await _user1.AddActivity(newActivity1);
12261226
response = await _user1.AddActivity(newActivity2);
12271227

1228-
1229-
12301228
await _agg4.FollowFeed(this._user1);
12311229

1232-
12331230
var activities = await this._agg4.GetActivities(0);
12341231
Assert.IsNotNull(activities);
12351232
Assert.AreEqual(1, activities.Count());

src/stream-net-tests/SigningTest.cs

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/stream-net/Activity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ internal JObject ToJObject(StreamClient client)
132132
if (To.SafeCount() > 0)
133133
{
134134
JArray toArray = new JArray();
135-
(from t in To select client.SignTo(t)).ForEach((st) =>
135+
To.ForEach((st) =>
136136
{
137137
toArray.Add(st);
138138
});

src/stream-net/BatchOperations.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ public async Task AddToMany(Activity activity, IEnumerable<string> feedIds)
7676
request.SetJsonBody(
7777
"{" + string.Format("\"activity\": {0}, \"feeds\": {1}", activity.ToJson(this._client), JsonConvert.SerializeObject(feedIds)) + "}"
7878
);
79-
_client.SignRequest(request);
8079

8180
var response = await _client.MakeRequest(request);
8281

@@ -101,8 +100,6 @@ public async Task FollowMany(IEnumerable<Follow> follows, int activityCopyLimit
101100
target = f.Target
102101
}));
103102

104-
_client.SignRequest(request);
105-
106103
var response = await _client.MakeRequest(request);
107104

108105
if (response.StatusCode != System.Net.HttpStatusCode.Created)
@@ -116,7 +113,7 @@ public async Task<IEnumerable<Activity>> GetActivities(IEnumerable<string> ids =
116113
if (ids != null && foreignIDTimes != null)
117114
throw new ArgumentException("at most one of the parameters ids or foreignIdTimes must be provided", "ids, foreignIDTimes");
118115

119-
var request = _client.BuildJWTAppRequest("activities/", HttpMethod.GET);
116+
var request = _client.BuildAppRequest("activities/", HttpMethod.GET);
120117

121118
if (ids != null)
122119
{
@@ -140,7 +137,7 @@ public async Task<IEnumerable<Activity>> GetActivities(IEnumerable<string> ids =
140137

141138
public async Task UpdateActivities(IEnumerable<Activity> activities)
142139
{
143-
var request = _client.BuildJWTAppRequest("activities/", HttpMethod.POST);
140+
var request = _client.BuildAppRequest("activities/", HttpMethod.POST);
144141
request.SetJsonBody(Activity.ToActivitiesJson(activities, this._client));
145142

146143
var response = await this._client.MakeRequest(request);
@@ -151,7 +148,7 @@ public async Task UpdateActivities(IEnumerable<Activity> activities)
151148

152149
public async Task ActivitiesPartialUpdate(IEnumerable<ActivityPartialUpdateRequestObject> updates)
153150
{
154-
var request = this._client.BuildJWTAppRequest("activity/", HttpMethod.POST);
151+
var request = this._client.BuildAppRequest("activity/", HttpMethod.POST);
155152

156153
var requestData = new Dictionary<string, object>(){
157154
{"changes", updates.Select(x => x.ToJObject())}

src/stream-net/Collections.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public async Task UpsertMany(string collectionName, IEnumerable<CollectionObject
129129
new JProperty("data", new JObject(
130130
new JProperty(collectionName, data.Select(x => x.ToJObject())))));
131131

132-
var request = this._client.BuildJWTAppRequest("collections/", HttpMethod.POST);
132+
var request = this._client.BuildAppRequest("collections/", HttpMethod.POST);
133133
request.SetJsonBody(dataJson.ToString());
134134

135135
var response = await this._client.MakeRequest(request);
@@ -148,7 +148,7 @@ public async Task<IEnumerable<CollectionObject>> SelectMany(string collectionNam
148148
{
149149
var foreignIds = ids.Select(x => string.Format("{0}:{1}", collectionName, x));
150150

151-
var request = this._client.BuildJWTAppRequest("collections/", HttpMethod.GET);
151+
var request = this._client.BuildAppRequest("collections/", HttpMethod.GET);
152152
request.AddQueryParameter("foreign_ids", string.Join(",", foreignIds));
153153

154154
var response = await this._client.MakeRequest(request);
@@ -161,7 +161,7 @@ public async Task<IEnumerable<CollectionObject>> SelectMany(string collectionNam
161161

162162
public async Task DeleteMany(string collectionName, IEnumerable<string> ids)
163163
{
164-
var request = this._client.BuildJWTAppRequest("collections/", HttpMethod.DELETE);
164+
var request = this._client.BuildAppRequest("collections/", HttpMethod.DELETE);
165165
request.AddQueryParameter("collection_name", collectionName);
166166
request.AddQueryParameter("ids", string.Join(",", ids));
167167

@@ -180,7 +180,7 @@ public async Task<CollectionObject> Add(string collectionName, GenericData data,
180180
_data = data,
181181
};
182182

183-
var request = this._client.BuildJWTAppRequest($"collections/{collectionName}/", HttpMethod.POST);
183+
var request = this._client.BuildAppRequest($"collections/{collectionName}/", HttpMethod.POST);
184184
request.SetJsonBody(collectionObject.ToJson());
185185

186186
var response = await this._client.MakeRequest(request);
@@ -193,7 +193,7 @@ public async Task<CollectionObject> Add(string collectionName, GenericData data,
193193

194194
public async Task<CollectionObject> Get(string collectionName, string ID)
195195
{
196-
var request = this._client.BuildJWTAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.GET);
196+
var request = this._client.BuildAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.GET);
197197

198198
var response = await this._client.MakeRequest(request);
199199

@@ -206,7 +206,7 @@ public async Task<CollectionObject> Get(string collectionName, string ID)
206206
public async Task<CollectionObject> Update(string collectionName, string ID, GenericData data)
207207
{
208208
var dataJson = new JObject(new JProperty("data", data.ToJObject()));
209-
var request = this._client.BuildJWTAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.PUT);
209+
var request = this._client.BuildAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.PUT);
210210
request.SetJsonBody(dataJson.ToString());
211211

212212
var response = await this._client.MakeRequest(request);
@@ -219,7 +219,7 @@ public async Task<CollectionObject> Update(string collectionName, string ID, Gen
219219

220220
public async Task Delete(string collectionName, string ID)
221221
{
222-
var request = this._client.BuildJWTAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.DELETE);
222+
var request = this._client.BuildAppRequest($"collections/{collectionName}/{ID}/", HttpMethod.DELETE);
223223

224224
var response = await this._client.MakeRequest(request);
225225

src/stream-net/IStreamClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public interface IStreamClient
99
Collections Collections { get; }
1010
Reactions Reactions { get; }
1111
Users Users { get; }
12+
Personalization Personalization { get; }
1213

1314
Task ActivityPartialUpdate(string id = null, ForeignIDTime foreignIDTime = null, GenericData set = null, IEnumerable<string> unset = null);
1415
IStreamFeed Feed(string feedSlug, string userId);

src/stream-net/IStreamFeed.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ namespace Stream
66
public interface IStreamFeed
77
{
88
string FeedId { get; }
9-
string ReadOnlyToken { get; }
10-
string Token { get; }
119
string UrlPath { get; }
10+
string EnrichedPath { get; }
1211

1312
Task<IEnumerable<Activity>> AddActivities(IEnumerable<Activity> activities);
1413
Task<Activity> AddActivity(Activity activity);

src/stream-net/Reactions.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class ReactionsWithActivity
1313
{
1414
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "results")]
1515
public IEnumerable<Reaction> Reactions { get; internal set; }
16-
16+
1717
public EnrichedActivity Activity { get; internal set; }
1818
}
1919

@@ -73,7 +73,7 @@ public ReactionFiltering WithFilter(ReactionFilter filter)
7373
}
7474

7575
internal ReactionFiltering WithActivityData()
76-
{
76+
{
7777
_filter = (_filter == null) ? ReactionFilter.Where().WithActivityData() : _filter.WithActivityData();
7878

7979
return this;
@@ -178,7 +178,7 @@ internal static EnrichedActivity GetActivity(string json)
178178

179179
return null;
180180
}
181-
}
181+
}
182182

183183
internal Reactions(StreamClient client)
184184
{
@@ -217,7 +217,7 @@ public async Task<Reaction> AddChild(Reaction parent, string kind, string userID
217217

218218
public async Task<Reaction> Get(string reactionID)
219219
{
220-
var request = this._client.BuildJWTAppRequest($"reaction/{reactionID}/", HttpMethod.GET);
220+
var request = this._client.BuildAppRequest($"reaction/{reactionID}/", HttpMethod.GET);
221221

222222
var response = await this._client.MakeRequest(request);
223223

@@ -228,19 +228,19 @@ public async Task<Reaction> Get(string reactionID)
228228
}
229229

230230
public async Task<IEnumerable<Reaction>> Filter(ReactionFiltering filtering, ReactionPagination pagination)
231-
{
231+
{
232232
var response = await FilterHelper(filtering, pagination);
233233

234234
if (response.StatusCode == System.Net.HttpStatusCode.OK)
235-
{
235+
{
236236
return JsonConvert.DeserializeObject<ReactionsFilterResponse>(response.Content).Reactions;
237237
}
238238

239239
throw StreamException.FromResponse(response);
240240
}
241241

242242
public async Task<ReactionsWithActivity> FilterWithActivityData(ReactionFiltering filtering, ReactionPagination pagination)
243-
{
243+
{
244244
var response = await FilterHelper(filtering.WithActivityData(), pagination);
245245

246246
if (response.StatusCode == System.Net.HttpStatusCode.OK)
@@ -261,9 +261,9 @@ public async Task<ReactionsWithActivity> FilterWithActivityData(ReactionFilterin
261261
private async Task<RestResponse> FilterHelper(ReactionFiltering filtering, ReactionPagination pagination)
262262
{
263263
var urlPath = pagination.GetPath();
264-
var request = this._client.BuildJWTAppRequest($"reaction/{urlPath}", HttpMethod.GET);
264+
var request = this._client.BuildAppRequest($"reaction/{urlPath}", HttpMethod.GET);
265265
filtering.Apply(request);
266-
266+
267267
var response = await this._client.MakeRequest(request);
268268

269269
return response;
@@ -278,7 +278,7 @@ public async Task<Reaction> Update(string reactionID, IDictionary<string, object
278278
TargetFeeds = targetFeeds
279279
};
280280

281-
var request = this._client.BuildJWTAppRequest($"reaction/{reactionID}/", HttpMethod.PUT);
281+
var request = this._client.BuildAppRequest($"reaction/{reactionID}/", HttpMethod.PUT);
282282
request.SetJsonBody(JsonConvert.SerializeObject(r));
283283

284284
var response = await this._client.MakeRequest(request);
@@ -292,7 +292,7 @@ public async Task<Reaction> Update(string reactionID, IDictionary<string, object
292292

293293
public async Task Delete(string reactionID)
294294
{
295-
var request = this._client.BuildJWTAppRequest($"reaction/{reactionID}/", HttpMethod.DELETE);
295+
var request = this._client.BuildAppRequest($"reaction/{reactionID}/", HttpMethod.DELETE);
296296

297297
var response = await this._client.MakeRequest(request);
298298

@@ -302,7 +302,7 @@ public async Task Delete(string reactionID)
302302

303303
private async Task<Reaction> Add(Reaction r)
304304
{
305-
var request = this._client.BuildJWTAppRequest("reaction/", HttpMethod.POST);
305+
var request = this._client.BuildAppRequest("reaction/", HttpMethod.POST);
306306
request.SetJsonBody(JsonConvert.SerializeObject(r));
307307

308308
var response = await this._client.MakeRequest(request);

src/stream-net/StreamClient.cs

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ public IStreamFeed Feed(string feedSlug, string userId)
7171
if (string.IsNullOrWhiteSpace(userId))
7272
throw new ArgumentNullException("userId", "Must have an userId");
7373

74-
string token = Sign(feedSlug + userId);
75-
return new StreamFeed(this, feedSlug, userId, token);
74+
return new StreamFeed(this, feedSlug, userId);
7675
}
7776

7877
public async Task ActivityPartialUpdate(string id = null, ForeignIDTime foreignIDTime = null, GenericData set = null, IEnumerable<string> unset = null)
@@ -200,38 +199,16 @@ internal RestRequest BuildActivitiesRequest(StreamFeed feed)
200199
return BuildRestRequest(BaseUrlPath + ActivitiesUrlPath, HttpMethod.POST);
201200
}
202201

203-
internal RestRequest BuildJWTAppRequest(string path, HttpMethod method)
204-
{
205-
return BuildRestRequest(BaseUrlPath + path, method);
206-
}
207-
208202
internal RestRequest BuildAppRequest(string path, HttpMethod method)
209203
{
210-
var request = new RestRequest(BaseUrlPath + path, method);
211-
request.AddHeader("X-Api-Key", _apiKey);
212-
return request;
204+
return BuildRestRequest(BaseUrlPath + path, method);
213205
}
214206

215207
internal RestRequest BuildPersonalizationRequest(string path, HttpMethod method)
216208
{
217209
return BuildRestRequest(BasePersonalizationUrlPath + path, method, "*");
218210
}
219211

220-
internal void SignRequest(RestRequest request)
221-
{
222-
// make signature
223-
var queryString = "";
224-
request.QueryParameters.ForEach((p) =>
225-
{
226-
queryString += (queryString.Length == 0) ? "?" : "&";
227-
queryString += string.Format("{0}={1}", p.Key, Uri.EscapeDataString(p.Value.ToString()));
228-
});
229-
var toSign = string.Format("(request-target): {0} {1}", request.Method.ToString().ToLower(), request.Resource + queryString);
230-
231-
var signature = string.Format("keyId=\"{0}\",algorithm=\"hmac-sha256\",headers=\"(request-target)\",signature=\"{1}\"", this._apiKey, Sign256(toSign));
232-
request.AddHeader("Authorization", "Signature " + signature);
233-
}
234-
235212
internal Task<RestResponse> MakeRequest(RestRequest request)
236213
{
237214
return _client.Execute(request);
@@ -245,26 +222,6 @@ private static string Base64UrlEncode(byte[] input)
245222
.Trim('=');
246223
}
247224

248-
internal string Sign(string feedId)
249-
{
250-
Encoding encoding = new ASCIIEncoding();
251-
#if NETCORE
252-
var hashedSecret = SHA1.Create().ComputeHash(encoding.GetBytes(_apiSecret));
253-
#else
254-
var hashedSecret = (new SHA1Managed()).ComputeHash(encoding.GetBytes(_apiSecret));
255-
#endif
256-
257-
var hmac = new HMACSHA1(hashedSecret);
258-
return Base64UrlEncode(hmac.ComputeHash(encoding.GetBytes(feedId)));
259-
}
260-
261-
internal string Sign256(string feedId)
262-
{
263-
Encoding encoding = new ASCIIEncoding();
264-
var hmac = new HMACSHA256(encoding.GetBytes(_apiSecret));
265-
return Convert.ToBase64String(hmac.ComputeHash(encoding.GetBytes(feedId)));
266-
}
267-
268225
internal string JWToken(string feedId, string userID = null)
269226
{
270227
var payload = new Dictionary<string, string>()
@@ -300,12 +257,5 @@ internal string JWToken(object payload)
300257
}
301258
return string.Join(".", segments.ToArray());
302259
}
303-
304-
internal string SignTo(string to)
305-
{
306-
string[] bits = to.Split(':');
307-
var otherFeed = this.Feed(bits[0], bits[1]);
308-
return to + " " + otherFeed.Token;
309-
}
310260
}
311261
}

0 commit comments

Comments
 (0)