Skip to content

Commit a578eb5

Browse files
Added XForwardedFor
1 parent b17407b commit a578eb5

File tree

4 files changed

+30
-16
lines changed

4 files changed

+30
-16
lines changed

QueueIT.QueueToken.Tests/EnqueueTokenTest.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,14 @@ public void Factory_WithEventId()
8383
public void Factory_WithIPAddress()
8484
{
8585
string expectedIpAddress = "1.5.8.9";
86-
86+
string expectedXForwardedFor = "45.67.2.4,34.56.3.2";
8787
IEnqueueToken token = Token
8888
.Enqueue("ticketania")
89-
.WithIpAddress(expectedIpAddress)
89+
.WithIpAddress(expectedIpAddress, expectedXForwardedFor)
9090
.Generate("5ebbf794-1665-4d48-80d6-21ac34be7faedf9e10b3-551a-4682-bb77-fee59d6355d6");
9191

9292
Assert.Equal(expectedIpAddress, token.IpAddress);
93+
Assert.Equal(expectedXForwardedFor, token.XForwardedFor);
9394
}
9495

9596
[Fact]
@@ -151,6 +152,7 @@ public void GenerateToken_WithPayload()
151152
new DateTime(2018, 08, 20, 0, 0, 0, DateTimeKind.Utc),
152153
new DateTime(2018, 10, 10, 0, 0, 0, DateTimeKind.Utc),
153154
null,
155+
null,
154156
payload);
155157
token.Generate("5ebbf794-1665-4d48-80d6-21ac34be7faedf9e10b3-551a-4682-bb77-fee59d6355d6", false);
156158

@@ -163,7 +165,7 @@ public void GenerateToken_WithPayload()
163165
public void GenerateToken_WithoutPayload()
164166
{
165167
string expectedSignedToken =
166-
"eyJ0eXAiOiJRVDEiLCJlbmMiOiJBRVMyNTYiLCJpc3MiOjE1MzQ3MjMyMDAwMDAsImV4cCI6MTUzOTEyOTYwMDAwMCwidGkiOiJhMjFkNDIzYS00M2ZkLTQ4MjEtODRmYS00MzkwZjZhMmZkM2UiLCJjIjoidGlja2V0YW5pYSIsImUiOiJteWV2ZW50IiwiaXAiOiI1LjcuOC42In0..rqQznIDybri70GrsJ-hd_Hzp98HUqcsBGnWaiyqjlvY";
168+
"eyJ0eXAiOiJRVDEiLCJlbmMiOiJBRVMyNTYiLCJpc3MiOjE1MzQ3MjMyMDAwMDAsImV4cCI6MTUzOTEyOTYwMDAwMCwidGkiOiJhMjFkNDIzYS00M2ZkLTQ4MjEtODRmYS00MzkwZjZhMmZkM2UiLCJjIjoidGlja2V0YW5pYSIsImUiOiJteWV2ZW50IiwiaXAiOiI1LjcuOC42IiwieGZmIjoiNDUuNjcuMi40LDM0LjU2LjMuMiJ9..wUOdVDIKlrIqumpU33bShDPdvTkicRk3q4Z-Vs8epFc";
167169

168170
EnqueueToken token = new EnqueueToken(
169171
"a21d423a-43fd-4821-84fa-4390f6a2fd3e",
@@ -172,6 +174,7 @@ public void GenerateToken_WithoutPayload()
172174
new DateTime(2018, 08, 20, 0, 0, 0, DateTimeKind.Utc),
173175
new DateTime(2018, 10, 10, 0, 0, 0, DateTimeKind.Utc),
174176
"5.7.8.6",
177+
"45.67.2.4,34.56.3.2",
175178
null);
176179
token.Generate("5ebbf794-1665-4d48-80d6-21ac34be7faedf9e10b3-551a-4682-bb77-fee59d6355d6", false);
177180

@@ -193,6 +196,7 @@ public void GenerateToken_MinimalHeader()
193196
new DateTime(2018, 08, 20, 0, 0, 0, DateTimeKind.Utc),
194197
null,
195198
null,
199+
null,
196200
null);
197201
token.Generate("5ebbf794-1665-4d48-80d6-21ac34be7faedf9e10b3-551a-4682-bb77-fee59d6355d6", false);
198202

@@ -204,9 +208,9 @@ public void GenerateToken_MinimalHeader()
204208
[Fact]
205209
public void Parse_WithoutPayload()
206210
{
207-
string hash = "rqQznIDybri70GrsJ-hd_Hzp98HUqcsBGnWaiyqjlvY";
211+
string hash = "wUOdVDIKlrIqumpU33bShDPdvTkicRk3q4Z-Vs8epFc";
208212
string token =
209-
"eyJ0eXAiOiJRVDEiLCJlbmMiOiJBRVMyNTYiLCJpc3MiOjE1MzQ3MjMyMDAwMDAsImV4cCI6MTUzOTEyOTYwMDAwMCwidGkiOiJhMjFkNDIzYS00M2ZkLTQ4MjEtODRmYS00MzkwZjZhMmZkM2UiLCJjIjoidGlja2V0YW5pYSIsImUiOiJteWV2ZW50IiwiaXAiOiI1LjcuOC42In0.";
213+
"eyJ0eXAiOiJRVDEiLCJlbmMiOiJBRVMyNTYiLCJpc3MiOjE1MzQ3MjMyMDAwMDAsImV4cCI6MTUzOTEyOTYwMDAwMCwidGkiOiJhMjFkNDIzYS00M2ZkLTQ4MjEtODRmYS00MzkwZjZhMmZkM2UiLCJjIjoidGlja2V0YW5pYSIsImUiOiJteWV2ZW50IiwiaXAiOiI1LjcuOC42IiwieGZmIjoiNDUuNjcuMi40LDM0LjU2LjMuMiJ9.";
210214
string tokenString = token + "." + hash;
211215

212216
var enqueueToken = Token.Parse(tokenString, "5ebbf794-1665-4d48-80d6-21ac34be7faedf9e10b3-551a-4682-bb77-fee59d6355d6");
@@ -215,6 +219,7 @@ public void Parse_WithoutPayload()
215219
Assert.Equal("ticketania", enqueueToken.CustomerId);
216220
Assert.Equal("myevent", enqueueToken.EventId);
217221
Assert.Equal("5.7.8.6", enqueueToken.IpAddress);
222+
Assert.Equal("45.67.2.4,34.56.3.2", enqueueToken.XForwardedFor);
218223
Assert.Equal(new DateTime(2018, 10, 10, 0, 0, 0, DateTimeKind.Utc), enqueueToken.Expires);
219224
Assert.Equal(new DateTime(2018, 08, 20, 0, 0, 0, DateTimeKind.Utc), enqueueToken.Issued);
220225
Assert.Equal(hash, enqueueToken.HashCode);

QueueIT.QueueToken/Model/HeaderDto.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public class HeaderDto
2424
public string EventId { get; set; }
2525
[DataMember(Name = "ip", Order = 8, EmitDefaultValue = false)]
2626
public string IpAddress { get; set; }
27+
[DataMember(Name = "xff", Order = 9, EmitDefaultValue = false)]
28+
public string XForwardedFor { get; set; }
2729

2830
internal static HeaderDto DeserializeHeader(string input)
2931
{

QueueIT.QueueToken/Token.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public IEnqueueToken Generate(string secretKey)
6161
return _token;
6262
}
6363

64-
public EnqueueTokenGenerator WithIpAddress(string ipAddress)
64+
public EnqueueTokenGenerator WithIpAddress(string ipAddress, string xForwardedFor)
6565
{
66-
this._token = EnqueueToken.AddIPAddress(this._token, ipAddress);
66+
this._token = EnqueueToken.AddIPAddress(this._token, ipAddress, xForwardedFor);
6767

6868
return this;
6969
}
@@ -79,6 +79,7 @@ public interface IEnqueueToken
7979
string CustomerId { get; }
8080
string EventId { get; }
8181
string IpAddress { get; }
82+
string XForwardedFor { get; }
8283
IEnqueueTokenPayload Payload { get; }
8384
string TokenWithoutHash { get; }
8485
string Token { get; }
@@ -91,6 +92,7 @@ internal class EnqueueToken : IEnqueueToken
9192
public string CustomerId { get; }
9293
public string EventId { get; }
9394
public string IpAddress { get; }
95+
public string XForwardedFor { get; }
9496
public DateTime Issued { get; }
9597
public string TokenIdentifier { get; private set; }
9698
public TokenVersion TokenVersion => TokenVersion.QT1;
@@ -117,7 +119,7 @@ private static string GetTokenIdentifier(string tokenIdentifierPrefix)
117119
: $"{tokenIdentifierPrefix}~{Guid.NewGuid()}";
118120
}
119121

120-
internal EnqueueToken(string tokenIdentifier, string customerId, string eventId, DateTime issued, DateTime? expires, string ipAddress, IEnqueueTokenPayload payload)
122+
internal EnqueueToken(string tokenIdentifier, string customerId, string eventId, DateTime issued, DateTime? expires, string ipAddress, string xForwardedFor, IEnqueueTokenPayload payload)
121123
{
122124
TokenIdentifier = tokenIdentifier;
123125
CustomerId = customerId;
@@ -126,6 +128,7 @@ internal EnqueueToken(string tokenIdentifier, string customerId, string eventId,
126128
Expires = expires ?? DateTime.MaxValue;
127129
Payload = payload;
128130
IpAddress = ipAddress;
131+
XForwardedFor = xForwardedFor;
129132
}
130133

131134
internal void Generate(string secretKey, bool resetTokenIdentifier = true)
@@ -144,7 +147,8 @@ internal void Generate(string secretKey, bool resetTokenIdentifier = true)
144147
Expires = Expires == DateTime.MaxValue ? null : (long?)(new DateTimeOffset(Expires)).ToUnixTimeMilliseconds(),
145148
Encryption = EncryptionType.AES256.ToString(),
146149
TokenVersion = TokenVersion.QT1.ToString(),
147-
IpAddress = IpAddress
150+
IpAddress = IpAddress,
151+
XForwardedFor = XForwardedFor
148152
};
149153

150154
string serialized = dto.Serialize() + ".";
@@ -206,6 +210,7 @@ public static IEnqueueToken Parse(string tokenString, string secretKey)
206210
? new DateTime?(DateTimeOffset.FromUnixTimeMilliseconds(headerModel.Expires.Value).DateTime)
207211
: null,
208212
headerModel.IpAddress,
213+
headerModel.XForwardedFor,
209214
payload)
210215
{
211216
TokenWithoutHash = token,
@@ -218,21 +223,21 @@ public static IEnqueueToken Parse(string tokenString, string secretKey)
218223
}
219224
}
220225

221-
internal static EnqueueToken AddIPAddress(EnqueueToken token, string ipAddress)
226+
internal static EnqueueToken AddIPAddress(EnqueueToken token, string ipAddress, string xForwardedFor)
222227
{
223-
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, token.Expires, ipAddress, token.Payload);
228+
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, token.Expires, ipAddress, xForwardedFor, token.Payload);
224229
}
225230
internal static EnqueueToken AddEventId(EnqueueToken token, string eventId)
226231
{
227-
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, eventId, token.Issued, token.Expires, token.IpAddress, token.Payload);
232+
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, eventId, token.Issued, token.Expires, token.IpAddress, token.XForwardedFor, token.Payload);
228233
}
229234
internal static EnqueueToken AddExpires(EnqueueToken token, DateTime expires)
230235
{
231-
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, expires, token.IpAddress, token.Payload);
236+
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, expires, token.IpAddress, token.XForwardedFor, token.Payload);
232237
}
233238
internal static EnqueueToken AddPayload(EnqueueToken token, IEnqueueTokenPayload payload)
234239
{
235-
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, token.Expires, token.IpAddress, payload);
240+
return new EnqueueToken(token.TokenIdentifier, token.CustomerId, token.EventId, token.Issued, token.Expires, token.IpAddress, token.XForwardedFor, payload);
236241
}
237242
}
238243

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ The token consists of two parts. Firstly, a header containing non-sensitive meta
1313
"ti": "159aba3e-55e1-4f54-b6ee-e5b943d7e885”,
1414
"c": "ticketania",
1515
"e": "demoevent”,
16-
"ip": "75.86.129.4"
16+
"ip": "75.86.129.4",
17+
"xff": "45.67.2.4,34.56.3.2"
1718
}
1819
```
1920
- `typ`: The type of the token. Value must be “QFT1”. Required.
@@ -23,7 +24,8 @@ The token consists of two parts. Firstly, a header containing non-sensitive meta
2324
- `ti`: Unique Token ID (e.g. uuid). Used to uniquely identify tokens and restrict replay attacks. Required.
2425
- `c`: The Customer ID of the issuer. Token will only be valid on events on this account. Required.
2526
- `e`: The Event ID. If provided, token will only be valid on this event. Optional.
26-
- `ip`: The IP address the user the token is issued to. If provided, token will only be valid for this IP address. Optional.
27+
- `ip`: The IP address the user the token is issued to. If provided, the IP address is validated before issuing the token. Optional.
28+
- `xff`: The X-Forwarded-For headerof the request when the token is issued. If provided, the X-Forwarded-For header is validated before issuing the token. Optional.
2729

2830
### Token Payload
2931
```

0 commit comments

Comments
 (0)