Skip to content

Commit 6f23454

Browse files
xApp JWT Authorize and UserData (#32)
* Moved URL part platform/ to endpoint parameters * Added xApp JWT authorization and user data
1 parent 2d14b66 commit 6f23454

14 files changed

+208
-25
lines changed

src/XUMM.NET.SDK/Clients/Interfaces/IXummHttpClient.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ namespace XUMM.NET.SDK.Clients.Interfaces;
55

66
public interface IXummHttpClient
77
{
8+
Task<T> GetAsync<T>(HttpClient client, string endpoint);
89
Task<T> GetAsync<T>(string endpoint);
910
Task<T> GetPublicAsync<T>(string endpoint);
1011
Task<T> PostAsync<T>(string endpoint, object content);
1112
Task<T> PostAsync<T>(string endpoint, string json);
13+
Task<T> PostAsync<T>(HttpClient client, string endpoint, string json);
1214
Task<T> DeleteAsync<T>(string endpoint);
15+
Task<T> DeleteAsync<T>(HttpClient client, string endpoint);
1316
HttpClient GetHttpClient(bool setCredentials);
1417
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Threading.Tasks;
2+
using XUMM.NET.SDK.Models.XAppJwt;
3+
using XUMM.NET.SDK.Models.XAppJWT;
4+
5+
namespace XUMM.NET.SDK.Clients.Interfaces;
6+
7+
public interface IXummXAppJwtClient
8+
{
9+
/// <summary>
10+
/// Authorize with the One Time Token
11+
/// </summary>
12+
/// <param name="oneTimeToken">UUID (token) received (URL get param.) when Xumm launches your xApp URL.</param>
13+
Task<XummXAppJwtAuthorizeResponse> AuthorizeAsync(string oneTimeToken);
14+
15+
/// <summary>
16+
/// Key value store on a per user, per xApp basis. Store key/value data for one or more keys.
17+
/// </summary>
18+
/// <param name="jwt">The JWT obtained by calling the /authorize endpoint first.</param>
19+
/// <param name="key">Key/value store: one or more keys, separated by comma (lower case, a-z, 0-9, min. 3 chars)</param>
20+
Task<XummXAppJwtUserDataResponse> GetUserDataAsync(string jwt, string key);
21+
22+
/// <summary>
23+
/// Key value store on a per user, per xApp basis. Store key/value data for one specific key. On a duplicate key, the existing value is updated.
24+
/// </summary>
25+
/// <param name="jwt">The JWT obtained by calling the /authorize endpoint first.</param>
26+
/// <param name="key">Key/value store: key (lower case, a-z, 0-9, min. 3 chars)</param>
27+
/// <param name="json">JSON body containing the data to store for this key.</param>
28+
Task<XummXAppJwtUserDataUpdateResponse> SetUserDataAsync(string jwt, string key, string json);
29+
30+
/// <summary>
31+
/// Key value store on a per user, per xApp basis. Remove key&amp;value data for one specific key.
32+
/// </summary>
33+
/// <param name="jwt">The JWT obtained by calling the /authorize endpoint first.</param>
34+
/// <param name="key">Key/value store: key (lower case, a-z, 0-9, min. 3 chars)</param>
35+
Task<XummXAppJwtUserDataUpdateResponse> DeleteUserDataAsync(string jwt, string key);
36+
}

src/XUMM.NET.SDK/Clients/XummHttpClient.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public XummHttpClient(
2929
_logger = logger;
3030
}
3131

32+
public async Task<T> GetAsync<T>(HttpClient client, string endpoint)
33+
{
34+
return await SendAsync<T>(client, HttpMethod.Get, endpoint, default);
35+
}
36+
3237
public async Task<T> GetAsync<T>(string endpoint)
3338
{
3439
return await SendAsync<T>(HttpMethod.Get, endpoint, true, default);
@@ -49,11 +54,21 @@ public async Task<T> PostAsync<T>(string endpoint, string json)
4954
return await SendAsync<T>(HttpMethod.Post, endpoint, true, json);
5055
}
5156

57+
public async Task<T> PostAsync<T>(HttpClient client, string endpoint, string json)
58+
{
59+
return await SendAsync<T>(client, HttpMethod.Post, endpoint, json);
60+
}
61+
5262
public async Task<T> DeleteAsync<T>(string endpoint)
5363
{
5464
return await SendAsync<T>(HttpMethod.Delete, endpoint, true, default);
5565
}
5666

67+
public async Task<T> DeleteAsync<T>(HttpClient client, string endpoint)
68+
{
69+
return await SendAsync<T>(client, HttpMethod.Delete, endpoint, default);
70+
}
71+
5772
public HttpClient GetHttpClient(bool setCredentials)
5873
{
5974
var httpClient = _httpClientFactory.CreateClient();
@@ -70,11 +85,16 @@ public HttpClient GetHttpClient(bool setCredentials)
7085
return httpClient;
7186
}
7287

73-
private async Task<T> SendAsync<T>(HttpMethod method, string endpoint, bool setCredentials, string? json)
88+
private Task<T> SendAsync<T>(HttpMethod method, string endpoint, bool setCredentials, string? json)
89+
{
90+
var client = GetHttpClient(setCredentials);
91+
return SendAsync<T>(client, method, endpoint, json);
92+
}
93+
94+
private async Task<T> SendAsync<T>(HttpClient client, HttpMethod method, string endpoint, string? json)
7495
{
7596
try
7697
{
77-
using var client = GetHttpClient(setCredentials);
7898
using var requestMessage = new HttpRequestMessage(method, GetRequestUrl(endpoint));
7999

80100
if (json != null)
@@ -169,8 +189,7 @@ private string GetRequestUrl(string endpoint)
169189
result += "/";
170190
}
171191

172-
result += $"platform/{endpoint}";
173-
192+
result += endpoint;
174193
return result;
175194
}
176195
}

src/XUMM.NET.SDK/Clients/XummMiscAppStorageClient.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ public XummMiscAppStorageClient(IXummHttpClient httpClient)
2222
/// <inheritdoc />
2323
public async Task<XummStorage> GetAsync()
2424
{
25-
return await _httpClient.GetAsync<XummStorage>("app-storage");
25+
return await _httpClient.GetAsync<XummStorage>("platform/app-storage");
2626
}
2727

2828
/// <inheritdoc />
2929
public async Task<XummStorageStore> StoreAsync(string json)
3030
{
31-
return await _httpClient.PostAsync<XummStorageStore>("app-storage", json);
31+
return await _httpClient.PostAsync<XummStorageStore>("platform/app-storage", json);
3232
}
3333

3434
/// <inheritdoc />
3535
public async Task<XummStorageStore> ClearAsync()
3636
{
37-
return await _httpClient.DeleteAsync<XummStorageStore>("app-storage");
37+
return await _httpClient.DeleteAsync<XummStorageStore>("platform/app-storage");
3838
}
3939
}

src/XUMM.NET.SDK/Clients/XummMiscClient.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ public XummMiscClient(IXummHttpClient httpClient)
2828
/// <inheritdoc />
2929
public async Task<XummPong> GetPingAsync()
3030
{
31-
return await _httpClient.GetAsync<XummPong>("ping");
31+
return await _httpClient.GetAsync<XummPong>("platform/ping");
3232
}
3333

3434
/// <inheritdoc />
3535
public async Task<XummCuratedAssets> GetCuratedAssetsAsync()
3636
{
37-
return await _httpClient.GetAsync<XummCuratedAssets>("curated-assets");
37+
return await _httpClient.GetAsync<XummCuratedAssets>("platform/curated-assets");
3838
}
3939

4040
/// <inheritdoc />
@@ -45,7 +45,7 @@ public async Task<XummTransaction> GetTransactionAsync(string txHash)
4545
throw new ArgumentException("Value cannot be null or white space", nameof(txHash));
4646
}
4747

48-
return await _httpClient.GetAsync<XummTransaction>($"xrpl-tx/{txHash}");
48+
return await _httpClient.GetAsync<XummTransaction>($"platform/xrpl-tx/{txHash}");
4949
}
5050

5151
/// <inheritdoc />
@@ -58,7 +58,7 @@ public async Task<XummKycStatus> GetKycStatusAsync(string userTokenOrAccount)
5858

5959
if (userTokenOrAccount.IsAccountAddress())
6060
{
61-
var kycInfo = await _httpClient.GetPublicAsync<XummKycInfo>($"kyc-status/{userTokenOrAccount}");
61+
var kycInfo = await _httpClient.GetPublicAsync<XummKycInfo>($"platform/kyc-status/{userTokenOrAccount}");
6262
return kycInfo.KycApproved ? XummKycStatus.Successful : XummKycStatus.None;
6363
}
6464

@@ -69,7 +69,7 @@ public async Task<XummKycStatus> GetKycStatusAsync(string userTokenOrAccount)
6969
UserToken = userTokenOrAccount
7070
};
7171

72-
var kycInfo = await _httpClient.PostAsync<XummKycStatusInfo>("kyc-status", request);
72+
var kycInfo = await _httpClient.PostAsync<XummKycStatusInfo>("platform/kyc-status", request);
7373
return EnumHelper.GetValueFromName<XummKycStatus>(kycInfo.KycStatus);
7474
}
7575

@@ -84,7 +84,7 @@ public async Task<XummRates> GetRatesAsync(string currencyCode)
8484
throw new ArgumentException("Value cannot be null or white space", nameof(currencyCode));
8585
}
8686

87-
return await _httpClient.GetAsync<XummRates>($"rates/{currencyCode.Trim().ToUpperInvariant()}");
87+
return await _httpClient.GetAsync<XummRates>($"platform/rates/{currencyCode.Trim().ToUpperInvariant()}");
8888
}
8989

9090
/// <inheritdoc />
@@ -95,7 +95,7 @@ public async Task<XummUserTokens> VerifyUserTokenAsync(string userToken)
9595
throw new ArgumentException("Value cannot be null or white space", nameof(userToken));
9696
}
9797

98-
return await _httpClient.GetAsync<XummUserTokens>($"user-token/{userToken}");
98+
return await _httpClient.GetAsync<XummUserTokens>($"platform/user-token/{userToken}");
9999
}
100100

101101
/// <inheritdoc />
@@ -111,7 +111,7 @@ public async Task<XummUserTokens> VerifyUserTokensAsync(string[] userTokens)
111111
Tokens = new List<string>(userTokens)
112112
};
113113

114-
return await _httpClient.PostAsync<XummUserTokens>("user-tokens", request);
114+
return await _httpClient.PostAsync<XummUserTokens>("platform/user-tokens", request);
115115
}
116116

117117
/// <inheritdoc />
@@ -122,7 +122,7 @@ public async Task<XummAccountMetaResponse> AccountMetaAsync(string account)
122122
throw new ArgumentException("Value should be a valid account address", nameof(account));
123123
}
124124

125-
return await _httpClient.GetAsync<XummAccountMetaResponse>($"account-meta/{account}");
125+
return await _httpClient.GetAsync<XummAccountMetaResponse>($"platform/account-meta/{account}");
126126
}
127127

128128
/// <inheritdoc />

src/XUMM.NET.SDK/Clients/XummPayloadClient.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public XummPayloadClient(IXummHttpClient httpClient,
4747
{
4848
try
4949
{
50-
return await _httpClient.PostAsync<XummPayloadResponse>("payload", new Dictionary<string, object>
50+
return await _httpClient.PostAsync<XummPayloadResponse>("platform/payload", new Dictionary<string, object>
5151
{
5252
{
5353
"txJson", payloadTransaction
@@ -76,7 +76,7 @@ public XummPayloadClient(IXummHttpClient httpClient,
7676
{
7777
try
7878
{
79-
return await _httpClient.GetAsync<XummPayloadDetails>($"payload/{payloadUuid}");
79+
return await _httpClient.GetAsync<XummPayloadDetails>($"platform/payload/{payloadUuid}");
8080
}
8181
catch
8282
{
@@ -94,7 +94,7 @@ public XummPayloadClient(IXummHttpClient httpClient,
9494
{
9595
try
9696
{
97-
return await _httpClient.GetAsync<XummPayloadDetails>($"payload/ci/{customIdentifier}");
97+
return await _httpClient.GetAsync<XummPayloadDetails>($"platform/payload/ci/{customIdentifier}");
9898
}
9999
catch
100100
{
@@ -124,7 +124,7 @@ public XummPayloadClient(IXummHttpClient httpClient,
124124
{
125125
try
126126
{
127-
return await _httpClient.DeleteAsync<XummDeletePayload>($"payload/{payloadUuid}");
127+
return await _httpClient.DeleteAsync<XummDeletePayload>($"platform/payload/{payloadUuid}");
128128
}
129129
catch
130130
{
@@ -199,7 +199,7 @@ public async Task<XummPayloadResponse> CreateAndSubscribeAsync(XummPostBlobPaylo
199199
{
200200
try
201201
{
202-
return await _httpClient.PostAsync<XummPayloadResponse>("payload", payload);
202+
return await _httpClient.PostAsync<XummPayloadResponse>("platform/payload", payload);
203203
}
204204
catch
205205
{

src/XUMM.NET.SDK/Clients/XummXAppClient.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public async Task<XummXAppOttResponse> GetOneTimeTokenDataAsync(string oneTimeTo
3434
throw new ArgumentException("Value cannot be null or white space", nameof(oneTimeToken));
3535
}
3636

37-
return await _httpClient.GetAsync<XummXAppOttResponse>($"xapp/ott/{oneTimeToken}");
37+
return await _httpClient.GetAsync<XummXAppOttResponse>($"platform/xapp/ott/{oneTimeToken}");
3838
}
3939

4040
/// <inheritdoc />
@@ -51,7 +51,7 @@ public async Task<XummXAppOttResponse> ReFetchOneTimeTokenDataAsync(string oneTi
5151
}
5252

5353
var hash = $"{oneTimeToken}.{_config.ApiSecret}.{deviceId}".ToUpperInvariant().ToSha1Hash().ToLowerInvariant();
54-
return await _httpClient.GetAsync<XummXAppOttResponse>($"xapp/ott/{oneTimeToken}/{hash}");
54+
return await _httpClient.GetAsync<XummXAppOttResponse>($"platform/xapp/ott/{oneTimeToken}/{hash}");
5555
}
5656

5757
/// <inheritdoc />
@@ -67,7 +67,7 @@ public async Task<XummXAppEventResponse> EventAsync(XummXAppEventRequest request
6767
throw new ArgumentException("Value cannot be null or white space", nameof(request.Body));
6868
}
6969

70-
return await _httpClient.PostAsync<XummXAppEventResponse>("xapp/event", request);
70+
return await _httpClient.PostAsync<XummXAppEventResponse>("platform/xapp/event", request);
7171
}
7272

7373
/// <inheritdoc />
@@ -83,6 +83,6 @@ public async Task<XummXAppPushResponse> PushAsync(XummXAppPushRequest request)
8383
throw new ArgumentException("Value cannot be null or white space", nameof(request.Body));
8484
}
8585

86-
return await _httpClient.PostAsync<XummXAppPushResponse>("xapp/push", request);
86+
return await _httpClient.PostAsync<XummXAppPushResponse>("platform/xapp/push", request);
8787
}
8888
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using XUMM.NET.SDK.Clients.Interfaces;
4+
using XUMM.NET.SDK.Models.XAppJwt;
5+
using XUMM.NET.SDK.Models.XAppJWT;
6+
7+
namespace XUMM.NET.SDK.Clients;
8+
9+
public class XummXAppJwtClient : IXummXAppJwtClient
10+
{
11+
private readonly IXummHttpClient _httpClient;
12+
13+
/// <summary>
14+
/// Initializes a new instance of the <see cref="XummXAppJwtClient"/> class.
15+
/// </summary>
16+
public XummXAppJwtClient(IXummHttpClient httpClient)
17+
{
18+
_httpClient = httpClient;
19+
}
20+
21+
/// <inheritdoc />
22+
public async Task<XummXAppJwtAuthorizeResponse> AuthorizeAsync(string oneTimeToken)
23+
{
24+
if (string.IsNullOrWhiteSpace(oneTimeToken))
25+
{
26+
throw new ArgumentException("Value cannot be null or white space", nameof(oneTimeToken));
27+
}
28+
29+
var httpClient = _httpClient.GetHttpClient(true);
30+
httpClient.DefaultRequestHeaders.Add("X-API-OTT", oneTimeToken);
31+
return await _httpClient.GetAsync<XummXAppJwtAuthorizeResponse>(httpClient, "xapp-jwt/authorize");
32+
}
33+
34+
/// <inheritdoc />
35+
public async Task<XummXAppJwtUserDataResponse> GetUserDataAsync(string jwt, string key)
36+
{
37+
var httpClient = _httpClient.GetHttpClient(false);
38+
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {jwt}");
39+
40+
return await _httpClient.GetAsync<XummXAppJwtUserDataResponse>(httpClient, $"xapp-jwt/userdata/{key}");
41+
}
42+
43+
/// <inheritdoc />
44+
public async Task<XummXAppJwtUserDataUpdateResponse> SetUserDataAsync(string jwt, string key, string json)
45+
{
46+
var httpClient = _httpClient.GetHttpClient(false);
47+
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {jwt}");
48+
49+
return await _httpClient.PostAsync<XummXAppJwtUserDataUpdateResponse>(httpClient, $"xapp-jwt/userdata/{key}", json);
50+
}
51+
52+
/// <inheritdoc />
53+
public async Task<XummXAppJwtUserDataUpdateResponse> DeleteUserDataAsync(string jwt, string key)
54+
{
55+
var httpClient = _httpClient.GetHttpClient(false);
56+
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {jwt}");
57+
58+
return await _httpClient.DeleteAsync<XummXAppJwtUserDataUpdateResponse>(httpClient, $"xapp-jwt/userdata/{key}");
59+
}
60+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace XUMM.NET.SDK.Models.XAppJWT;
4+
5+
public class XummXAppJwtAppResponse
6+
{
7+
[JsonPropertyName("name")]
8+
public string Name { get; set; } = default!;
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Text.Json.Serialization;
2+
using XUMM.NET.SDK.Models.XApp;
3+
using XUMM.NET.SDK.Models.XAppJWT;
4+
5+
namespace XUMM.NET.SDK.Models.XAppJwt;
6+
7+
public class XummXAppJwtAuthorizeResponse
8+
{
9+
[JsonPropertyName("ott")]
10+
public XummXAppOttResponse OTT { get; set; } = default!;
11+
12+
[JsonPropertyName("app")]
13+
public XummXAppJwtAppResponse App { get; set; } = default!;
14+
15+
[JsonPropertyName("jwt")]
16+
public string JWT { get; set; } = default!;
17+
}

0 commit comments

Comments
 (0)