diff --git a/Gotrue/Api.cs b/Gotrue/Api.cs index 33adf17..fbd1119 100644 --- a/Gotrue/Api.cs +++ b/Gotrue/Api.cs @@ -44,11 +44,13 @@ public async Task SignUpWithEmail(string email, string password, SignUp { var body = new Dictionary { { "email", email }, { "password", password } }; + string endpoint = $"{Url}/signup"; + if (options != null) - { + { if (!string.IsNullOrEmpty(options.RedirectTo)) { - body.Add("redirectTo", options.RedirectTo); + endpoint = Helpers.AddQueryParams(endpoint, new Dictionary { { "redirect_to", options.RedirectTo } }).ToString(); } if (options.Data != null) @@ -57,7 +59,7 @@ public async Task SignUpWithEmail(string email, string password, SignUp } } - var response = await Helpers.MakeRequest(HttpMethod.Post, $"{Url}/signup", body, Headers); + var response = await Helpers.MakeRequest(HttpMethod.Post, endpoint, body, Headers); // Gotrue returns a Session object for an auto-/pre-confirmed account var session = JsonConvert.DeserializeObject(response.Content); @@ -94,15 +96,18 @@ public Task SignInWithEmail(string email, string password) public Task SendMagicLinkEmail(string email, SignInOptions options = null) { var data = new Dictionary { { "email", email } }; + + string endpoint = $"{Url}/magiclink"; + if (options != null) { if (!string.IsNullOrEmpty(options.RedirectTo)) { - data.Add("redirect_to", options.RedirectTo); + endpoint = Helpers.AddQueryParams(endpoint, new Dictionary { { "redirect_to", options.RedirectTo } }).ToString(); } } - return Helpers.MakeRequest(HttpMethod.Post, $"{Url}/magiclink", data, Headers); + return Helpers.MakeRequest(HttpMethod.Post, endpoint, data, Headers); } /// @@ -131,11 +136,13 @@ public Task SignUpWithPhone(string phone, string password, SignUpOption { "password", password }, }; + string endpoint = $"{Url}/signup"; + if (options != null) { if (!string.IsNullOrEmpty(options.RedirectTo)) { - body.Add("redirectTo", options.RedirectTo); + endpoint = Helpers.AddQueryParams(endpoint, new Dictionary { { "redirect_to", options.RedirectTo } }).ToString(); } if (options.Data != null) @@ -144,7 +151,7 @@ public Task SignUpWithPhone(string phone, string password, SignUpOption } } - return Helpers.MakeRequest(HttpMethod.Post, $"{Url}/signup", body, Headers); + return Helpers.MakeRequest(HttpMethod.Post, endpoint, body, Headers); } /// diff --git a/Gotrue/Client.cs b/Gotrue/Client.cs index b05da68..612054b 100644 --- a/Gotrue/Client.cs +++ b/Gotrue/Client.cs @@ -640,7 +640,7 @@ public async Task RefreshSession() /// public async Task GetSessionFromUrl(Uri uri, bool storeSession = true) { - var query = HttpUtility.ParseQueryString(uri.Query); + var query = string.IsNullOrEmpty(uri.Fragment) ? HttpUtility.ParseQueryString(uri.Query) : HttpUtility.ParseQueryString('?' + uri.Fragment.TrimStart('#')); var errorDescription = query.Get("error_description"); diff --git a/Gotrue/Helpers.cs b/Gotrue/Helpers.cs index 829c763..8daedaa 100644 --- a/Gotrue/Helpers.cs +++ b/Gotrue/Helpers.cs @@ -28,6 +28,25 @@ public static MapToAttribute GetMappedToAttr(Enum obj) return type.GetField(name).GetCustomAttributes(false).OfType().SingleOrDefault(); } + /// + /// Adds query params to a given Url + /// + /// + /// + /// + internal static Uri AddQueryParams(string url, Dictionary data) + { + var builder = new UriBuilder(url); + var query = HttpUtility.ParseQueryString(builder.Query); + + foreach (var param in data) + query[param.Key] = param.Value; + + builder.Query = query.ToString(); + + return builder.Uri; + } + private static readonly HttpClient client = new HttpClient(); ///