Skip to content

Commit

Permalink
Update usage of redirectTo to reflect gotrue-js usage (#30)
Browse files Browse the repository at this point in the history
* Update usage of redirectTo to reflect gotrue-js usage

* Fixes #29 by changing `redirect_to` into a query parameter instead of POST data
`GetSessionFromUrl` accounts for gotrue sending a url of the format: `http://localhost:9000?status=success#access_token=blahblah`
  • Loading branch information
RedChops authored Apr 23, 2022
1 parent df95a5c commit 466979b
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 8 deletions.
21 changes: 14 additions & 7 deletions Gotrue/Api.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,13 @@ public async Task<Session> SignUpWithEmail(string email, string password, SignUp
{
var body = new Dictionary<string, object> { { "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<string, string> { { "redirect_to", options.RedirectTo } }).ToString();
}

if (options.Data != null)
Expand All @@ -57,7 +59,7 @@ public async Task<Session> 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<Session>(response.Content);
Expand Down Expand Up @@ -94,15 +96,18 @@ public Task<Session> SignInWithEmail(string email, string password)
public Task<BaseResponse> SendMagicLinkEmail(string email, SignInOptions options = null)
{
var data = new Dictionary<string, string> { { "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<string, string> { { "redirect_to", options.RedirectTo } }).ToString();
}
}

return Helpers.MakeRequest(HttpMethod.Post, $"{Url}/magiclink", data, Headers);
return Helpers.MakeRequest(HttpMethod.Post, endpoint, data, Headers);
}

/// <summary>
Expand Down Expand Up @@ -131,11 +136,13 @@ public Task<Session> 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<string, string> { { "redirect_to", options.RedirectTo } }).ToString();
}

if (options.Data != null)
Expand All @@ -144,7 +151,7 @@ public Task<Session> SignUpWithPhone(string phone, string password, SignUpOption
}
}

return Helpers.MakeRequest<Session>(HttpMethod.Post, $"{Url}/signup", body, Headers);
return Helpers.MakeRequest<Session>(HttpMethod.Post, endpoint, body, Headers);
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion Gotrue/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,7 @@ public async Task<Session> RefreshSession()
/// <returns></returns>
public async Task<Session> 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");

Expand Down
19 changes: 19 additions & 0 deletions Gotrue/Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,25 @@ public static MapToAttribute GetMappedToAttr(Enum obj)
return type.GetField(name).GetCustomAttributes(false).OfType<MapToAttribute>().SingleOrDefault();
}

/// <summary>
/// Adds query params to a given Url
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <returns></returns>
internal static Uri AddQueryParams(string url, Dictionary<string, string> 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();

/// <summary>
Expand Down

0 comments on commit 466979b

Please sign in to comment.