Question

I've used the OAuth1Authenticator class from the Xamarin.Auth component library to allow users to login via Twitter. It authenticates correctly and gets me a response which has the following: oauth_token, oauth_token_secret, user_id, screen_name, oauth_consumer_key, oauth_consumer_secret.

Here is my code

OAuth1Authenticator twitterAuthenticator = new OAuth1Authenticator(Constants.Twitter.CONSUMER_KEY, Constants.Twitter.CONSUMER_SECRET, new Uri(Constants.Twitter.REQUEST_TOKEN_URL), new Uri(Constants.Twitter.AUTHORIZE_URL), new Uri(Constants.Twitter.ACCESS_TOKEN_URL), new Uri(Constants.Twitter.CALLBACK_URL));

            twitterAuthenticator.Completed += async (sender, e) =>
                {    
                    if (!e.IsAuthenticated)
                    {
                        return;
                    }

                    string oauth_token = e.Account.Properties["oauth_token"].ToString();

The question is how do I then use that response to signup/signin a Parse User ? i.e. I want a ParseUser created on the parse database via the Twitter token and the session should be taken care of, same way it works for sign-via-Facebook using ParseFacebookUtils class

Problem is Parse doesn't support Login via Twitter in Xamarin, however, I believe parse does support any type of 3rd party authentication in an alternative way as shown below but I don't know how to do it.

Here are the most relative links

https://parse.com/tutorials/adding-third-party-authentication-to-your-web-app but the problem in this link is that it's made as a webpage button, don't know how to use that on a mobile, and it's for GitHub don't know how to use it for Twitter instead (Twitter is only OAuth1)

http://blog.parse.com/2013/12/03/bring-your-own-login/ This is exactly what I need but it needs a session Token, doesn't work with the oauth_tokens that twitter responds back to me, hence don't know how to use the method mentioned in the link

https://github.com/auth0/rules/blob/master/parse.md This looks like the solution, however I don't know how to use it, it does show the twitter icon so it should work with twtiter but how do I get that to work in .NET Update: I've found this xamarin component http://components.xamarin.com/view/Auth0Client which gets me closer to use the method mentioned in the first link in this paragraph, yet I'm still lost and don't know how to link autho0 to parse

All in all, I'm lost in this maze and really wish anyone could help me out.

Was it helpful?

Solution

I don't have a Twitter account so I can't test this but it looks like your POST DTO would be this:

public class TwitterAuthRequest
{
    public AuthData authData { get; set; }
}

public class Twitter
{
    public string id { get; set; }
    public string screen_name { get; set; }
    public string consumer_key { get; set; }
    public string consumer_secret { get; set; }
    public string auth_token { get; set; }
    public string auth_token_secret { get; set; }
}

public class AuthData
{
    public Twitter twitter { get; set; }
}

With a response DTO like this:

public class TwitterAuthResponse
{
    public string username { get; set; }
    public string createdAt { get; set; }
    public string updatedAt { get; set; }
    public string objectId { get; set; }
    public string sessionToken { get; set; }
    public AuthData authData { get; set; }
}

public class Twitter
{
    public string id { get; set; }
    public string screen_name { get; set; }
    public string consumer_key { get; set; }
    public string consumer_secret { get; set; }
    public string auth_token { get; set; }
    public string auth_token_secret { get; set; }
}

public class AuthData
{
    public Twitter twitter { get; set; }
}

Don't forget to put in the headers:

("X-Parse-Application-Id", ApplicationId)
("X-Parse-REST-API-Key", ApplicationKey)

Source: https://parse.com/docs/rest#users

EDIT:

I have a created a draft for how you would use the DTO's:

public static class TwitterLoginProvider
{
    public static Task<ServiceResponse<TwitterAuthResponse>> Login(
        Twitter twitterInfo,
        string applicationId,
        string apiKey,
        IRestClient restClient)
    {
        var request = new TwitterAuthRequest () 
        {
            authData = new AuthData () 
            {
                twitter = twitterInfo
            }
        };

        restClient.AddHeader ("X-Parse-Application-Id", applicationId);
        restClient.AddHeader ("X-Parse-REST-API-Key", apiKey);

        return restClient.PostAsync<TwitterAuthResponse>("https://api.parse.com/1/users", request, Format.Json);
    }
}

When you get the response from Xamarin.Auth, use that info to create a Twitter object and pass it to the IRestClient. As a response from the service you will get a response with the session information.

IRestClient interface: https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Web/IRestClient.cs

Sample implementation: https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Web/RestClient.cs

Alternatively you could use RestSharp: http://restsharp.org/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top