Gonzo345
Gonzo345

Reputation: 1343

Grabbing Dropbox access token on Windows Form using Dropbox API

I have done a class which already works with the Dropbox API uploading files, downloading, deleting and so on. It has been working quite well since I was just using my own access token, but I need to register other users and a single but "big" problem appeared: retrieving the access token.

1.- Redirect URI? I'm starting to doubt why do I need this. I finally used this URI (https://www.dropbox.com/1/oauth2/redirect_receiver) because "The redirect URI you use doesn't really matter" Of course I included this one on my app config on Dropbox.

2.- I reach the user's account (I can see the user's count increased and I see the app has access to the user's account.

3.- I have a breakpoint on my code to inspect the variables in order to apply the DropboxOAuth2Helper.ParseTokenFragment but I have no success on there.

This is my code, but on the if before the try catch is where it gets stuck:

string AccessToken;
const string AppKey = "theOneAtmyAppConfigOnDropbox";
const string redirectUrl = "https://www.dropbox.com/1/oauth2/redirect_receiver";
string oauthUrl =
    $@"https://www.dropbox.com/1/oauth2/authorize?response_type=token&redirect_uri={redirectUrl}&client_id={AppKey}";

private string oauth2State;
private bool Result;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    Start(AppKey, webBrowser1);

    webBrowser1.Navigating += Browser_Navigating;
}

private void Start(string appKey, WebBrowser w)
{
    this.oauth2State = Guid.NewGuid().ToString("N");
    Uri authorizeUri = DropboxOAuth2Helper.GetAuthorizeUri(OauthResponseType.Token, appKey, redirectUrl, state: oauth2State);
    w.Navigate(authorizeUri);
}

private void Browser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    if (!e.Url.ToString().StartsWith(redirectUrl, StringComparison.InvariantCultureIgnoreCase))
    {

        // we need to ignore all navigation that isn't to the redirect uri.
        return;
    }

    try
    {
        OAuth2Response result = DropboxOAuth2Helper.ParseTokenFragment(e.Url);
        if (result.State != this.oauth2State)
        {
            // The state in the response doesn't match the state in the request.
            return;
        }

        this.AccessToken = result.AccessToken;
        this.Result = true;
    }
    catch (ArgumentException)
    {
        // There was an error in the URI passed to ParseTokenFragment
    }
    finally
    {
        e.Cancel = true;
        this.Close();
    }
}

I've been fighting against this for hours and I'm starting to see the things a little cloudy at this point.

This is the tutorial I used, but I'm not moving forward. I would really appreciate any help!

EDIT: I finally made some steps forward. I changed the line which contains

Uri authorizeUri2 = DropboxOAuth2Helper.GetAuthorizeUri(appKey);

Now I'm showing the generated access token on the WebClient! Bad part comes when trying to get it (it gets inside the if) and it gets generated every time I ask the user for permission, so it gets overwrited.

EDIT 2: I noted the token I get generated on the browser is somehow malformed. I try to manually change it hardcored when I'm debugging and I get an exception when an AuthException when creating the DropboxClient object :( What the hell!

Upvotes: 0

Views: 1506

Answers (1)

Gonzo345
Gonzo345

Reputation: 1343

As Greg stated, the solution was using the event Browser_Navigated. Looks like the version of the embedded IE my Visual Studio (2015) uses didn't notice that if it's a redirect, it won't launch the event BrowserNavigating.

Upvotes: 0

Related Questions