Skip to content

Commit 864de4b

Browse files
committed
Add server side Authenticate helper method
Full flow /auth/payload, personal sign, /auth/login
1 parent 1d277cf commit 864de4b

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

Assets/Thirdweb/Core/Scripts/Wallet.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
using Newtonsoft.Json.Linq;
1212
using Nethereum.Hex.HexTypes;
1313
using System.Linq;
14+
using UnityEngine.Networking;
15+
using Thirdweb.Redcode.Awaiting;
16+
using Newtonsoft.Json;
17+
18+
#pragma warning disable CS0618
1419

1520
namespace Thirdweb
1621
{
@@ -161,6 +166,61 @@ public async Task<LoginPayload> Authenticate(string domain)
161166
}
162167
}
163168

169+
/// <summary>
170+
/// Authenticates the user by signing a payload that can be used to securely identify users. See https://portal.thirdweb.com/auth.
171+
/// </summary>
172+
/// <param name="domain">The domain to authenticate to.</param>
173+
/// <returns>A string representing the server-side authentication result.</returns>
174+
public async Task<string> AuthenticateAndLoginServerSide(string domain, BigInteger chainId, string authPayloadPath = "/auth/payload", string authLoginPath = "/auth/login")
175+
{
176+
string payloadURL = domain + authPayloadPath;
177+
string loginURL = domain + authLoginPath;
178+
179+
var payloadBodyRaw = new { address = await ThirdwebManager.Instance.SDK.Wallet.GetAddress(), chainId = chainId.ToString() };
180+
var payloadBody = JsonConvert.SerializeObject(payloadBodyRaw);
181+
182+
using UnityWebRequest payloadRequest = UnityWebRequest.Post(payloadURL, "");
183+
payloadRequest.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(payloadBody));
184+
payloadRequest.downloadHandler = new DownloadHandlerBuffer();
185+
payloadRequest.SetRequestHeader("Content-Type", "application/json");
186+
await payloadRequest.SendWebRequest();
187+
if (payloadRequest.result != UnityWebRequest.Result.Success)
188+
{
189+
throw new Exception("Error: " + payloadRequest.error + "\nResponse: " + payloadRequest.downloadHandler.text);
190+
}
191+
var payloadString = payloadRequest.downloadHandler.text;
192+
193+
var loginBodyRaw = JsonConvert.DeserializeObject<LoginPayload>(payloadString);
194+
var resourcesString = loginBodyRaw.payload.Resources != null ? "\nResources:" + string.Join("", loginBodyRaw.payload.Resources.Select(r => $"\n- {r}")) : string.Empty;
195+
var payloadToSign =
196+
$"{loginBodyRaw.payload.Domain} wants you to sign in with your Ethereum account:"
197+
+ $"\n{loginBodyRaw.payload.Address}\n\n"
198+
+ $"{(string.IsNullOrEmpty(loginBodyRaw.payload.Statement) ? "" : $"{loginBodyRaw.payload.Statement}\n")}"
199+
+ $"{(string.IsNullOrEmpty(loginBodyRaw.payload.Uri) ? "" : $"\nURI: {loginBodyRaw.payload.Uri}")}"
200+
+ $"\nVersion: {loginBodyRaw.payload.Version}"
201+
+ $"\nChain ID: {loginBodyRaw.payload.ChainId}"
202+
+ $"\nNonce: {loginBodyRaw.payload.Nonce}"
203+
+ $"\nIssued At: {loginBodyRaw.payload.IssuedAt}"
204+
+ $"{(string.IsNullOrEmpty(loginBodyRaw.payload.ExpirationTime) ? "" : $"\nExpiration Time: {loginBodyRaw.payload.ExpirationTime}")}"
205+
+ $"{(string.IsNullOrEmpty(loginBodyRaw.payload.InvalidBefore) ? "" : $"\nNot Before: {loginBodyRaw.payload.InvalidBefore}")}"
206+
+ resourcesString;
207+
208+
loginBodyRaw.signature = await ThirdwebManager.Instance.SDK.Wallet.Sign(payloadToSign);
209+
var loginBody = JsonConvert.SerializeObject(new { payload = loginBodyRaw });
210+
211+
using UnityWebRequest loginRequest = UnityWebRequest.Post(loginURL, "");
212+
loginRequest.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(loginBody));
213+
loginRequest.downloadHandler = new DownloadHandlerBuffer();
214+
loginRequest.SetRequestHeader("Content-Type", "application/json");
215+
await loginRequest.SendWebRequest();
216+
if (loginRequest.result != UnityWebRequest.Result.Success)
217+
{
218+
throw new Exception("Error: " + loginRequest.error + "\nResponse: " + loginRequest.downloadHandler.text);
219+
}
220+
var responseString = loginRequest.downloadHandler.text;
221+
return responseString;
222+
}
223+
164224
/// <summary>
165225
/// Verifies the authenticity of a login payload.
166226
/// </summary>

0 commit comments

Comments
 (0)