|
11 | 11 | using Newtonsoft.Json.Linq;
|
12 | 12 | using Nethereum.Hex.HexTypes;
|
13 | 13 | using System.Linq;
|
| 14 | +using UnityEngine.Networking; |
| 15 | +using Thirdweb.Redcode.Awaiting; |
| 16 | +using Newtonsoft.Json; |
| 17 | + |
| 18 | +#pragma warning disable CS0618 |
14 | 19 |
|
15 | 20 | namespace Thirdweb
|
16 | 21 | {
|
@@ -161,6 +166,61 @@ public async Task<LoginPayload> Authenticate(string domain)
|
161 | 166 | }
|
162 | 167 | }
|
163 | 168 |
|
| 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 | + |
164 | 224 | /// <summary>
|
165 | 225 | /// Verifies the authenticity of a login payload.
|
166 | 226 | /// </summary>
|
|
0 commit comments