We're making changes to the Community, so you may have received some notifications - thanks for your patience and welcome back. Learn more here.

Forum Discussion

Shy1's avatar
Shy1
Explorer | Level 3
3 years ago

It must exactly match one of the redirect URIs you've pre-configured for your app (including the pat

 

I'm completely confused. I do it according to the documentation,
if I make a link with my hands in my browser and insert the AppiKey, then everything works,
if I try to do it through the code, I get this Invalid redirect_uri message.
It must exactly match one of the redirect URIs you've pre-configured for your app (including the path). In console I added redirect url just like in code private const string LoopbackHost = "http://127.0.0.1:4200/"; what is my problem

 

 

 

// Add an ApiKey (from https://www.dropbox.com/developers/apps) here
        private const string ApiKey = "XXX";

        // This loopback host is for demo purpose. If this port is not
        // available on your machine you need to update this URL with an unused port.
        private const string LoopbackHost = "http://127.0.0.1:4200/";

        // URL to receive OAuth 2 redirect from Dropbox server.
        // You also need to register this redirect URL on https://www.dropbox.com/developers/apps.
        private readonly Uri RedirectUri = new Uri(LoopbackHost + "authorize");

        // URL to receive access token from JS.
        private readonly Uri JSRedirectUri = new Uri(LoopbackHost + "token");
public async void MainRun()
        {
            var accessToken = await this.GetAccessToken();
        }
private async Task<string> GetAccessToken()
        {
            var accessToken = string.Empty;

            if (string.IsNullOrEmpty(accessToken))
            {
                try
                {
                    Console.WriteLine("Waiting for credentials.");
                    var state = Guid.NewGuid().ToString("N");
                    
                    var authorizeUri = DropboxOAuth2Helper.GetAuthorizeUri(OAuthResponseType.Token, ApiKey, RedirectUri, state: state);
                    
                    var http = new HttpListener();
                    http.Prefixes.Add(LoopbackHost);
                    http.Start();
                    Console.WriteLine(1);
                    
                    //Process.Start("C:\\Program Files\\Internet Explorer\\IExplore.exe", authorizeUri.ToString());

                    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                    {
                        string url = authorizeUri.ToString().Replace("&", "^&");
                        Process.Start(new ProcessStartInfo("cmd", $"/c start {url}"));//{ CreateNoWindow = true }
                        //Console.WriteLine(url);
                    }
                    else
                    {
                        Process.Start(authorizeUri.ToString());
                    }

                    // Handle OAuth redirect and send URL fragment to local server using JS.
                    await HandleOAuth2Redirect(http);
                    Console.WriteLine(2);
                    // Handle redirect from JS and process OAuth response.
                    var result = await HandleJSRedirect(http);
                    Console.WriteLine(3);
                    if (result.State != state)
                    {
                        // The state in the response doesn't match the state in the request.
                        return null;
                    }

                    Console.WriteLine("and back...");

                    accessToken = result.AccessToken;
                    var uid = result.Uid;
                    Console.WriteLine("Uid: {0}", uid);

                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: {0}", e.Message);
                    return null;
                }
            }

            return accessToken;
        }

        private async Task HandleOAuth2Redirect(HttpListener http)
        {
            var context = await http.GetContextAsync();

            // We only care about request to RedirectUri endpoint.
            while (context.Request.Url.AbsolutePath != RedirectUri.AbsolutePath)
            {
                context = await http.GetContextAsync();
            }

            context.Response.ContentType = "text/html";

            // Respond with a page which runs JS and sends URL fragment as query string
            // to TokenRedirectUri.
            using (var file = File.OpenRead("index.html"))
            {
                file.CopyTo(context.Response.OutputStream);
            }

            context.Response.OutputStream.Close();
        }

        /// <summary>
        /// Handle the redirect from JS and process raw redirect URI with fragment to
        /// complete the authorization flow.
        /// </summary>
        /// <param name="http">The http listener.</param>
        /// <returns>The <see cref="OAuth2Response"/></returns>
        private async Task<OAuth2Response> HandleJSRedirect(HttpListener http)
        {
            var context = await http.GetContextAsync();

            // We only care about request to TokenRedirectUri endpoint.
            while (context.Request.Url.AbsolutePath != JSRedirectUri.AbsolutePath)
            {
                context = await http.GetContextAsync();
            }

            var redirectUri = new Uri(context.Request.QueryString["url_with_fragment"]);

            var result = DropboxOAuth2Helper.ParseTokenFragment(redirectUri);

            return result;
        }

 

 

 

  • Здравко's avatar
    Здравко
    Legendary | Level 20

    Shy1 wrote:
    ...
    if I try to do it through the code, I get this Invalid redirect_uri message.
    It must exactly match one of the redirect URIs you've pre-configured for your app (including the path). In console I added redirect url just like in code private const string LoopbackHost = "http://127.0.0.1:4200/"; what is my problem

    ...


    Hi Shy1,

    To be honest, I'm not certain what exactly you're asking for (the question contains response within). I will speculate that you cannot understand difference between terms URI and host (domain name) and that's why you mix them. Your LoopbackHost keeps the host (represented as IP 127.0.0.1 - i.e. loopback IP) as part of URL used as a base for further construction of final redirect URI (here it's URL actually). On registration, complete URL have to be used without possible parameters (anchor isn't used at all). The parameters will be added on redirection and you should process them in your code. 😉 Hope now it's a bit more clear. Take a look here for more info related to URL anatomy (URI can be considered as a URL generalization, but in your case they mean the same thing in fact). 😁 How looks like the redirect URI in your code and is it registered appropriately? 🧐🙂 If you are still not sure, what appears in your browser address bar on redirection (and before that) and after remove parameters is it the same as the registered URI? Is your browser launched with the same URL when you make it by hands and through the code? Why?

    Hope this gives direction and clarifies matter.

     

    In addition, you can read the comments in your code:


    Shy1 wrote:

    ...

    ...
            // URL to receive OAuth 2 redirect from Dropbox server.
            // You also need to register this redirect URL on https://www.dropbox.com/developers/apps.
            private readonly Uri RedirectUri = new Uri(LoopbackHost + "authorize");
    ...

    ...


    Does the above advice (need to register this redirect URL on) take proper attention? 🤔

    • Shy1's avatar
      Shy1
      Explorer | Level 3

      i am just delete anchor and error disapear. but i am still cant redirect to my 127.0.01 i suppose at my configuration pc problem? but at the browser url i have request

      • Здравко's avatar
        Здравко
        Legendary | Level 20

        Shy1 wrote:

        i am just delete anchor and error disapear. ...


        Shy1, Hmm.. 🤔 How have you deleted something nonexistent? I can see some anchor in your code responsible for redirect URI construction! I'm not sure you have some "configuration pc problem", but most probably you are mixing anchor and resource path. 🙂

         


        Shy1 wrote:

        ... but at the browser url i have request


        Probably you mean the "redirect_uri" parameter there. Is the parameter value registered in the form it appears without your "correction"? 😉

        Let me guess what's there. At the beginning you have a constant:

        private const string LoopbackHost = "http://127.0.0.1:4200/";

        The 'LoopbackHost's value is clear, as you noted it's "http://127.0.0.1:4200/". Let's see the next value:

                // You also need to register this redirect URL on https://www.dropbox.com/developers/apps.
                private readonly Uri RedirectUri = new Uri(LoopbackHost + "authorize");

         Now we have previous value concatenated with "authorize" (i.e. 'RedirectUri's value is "http://127.0.0.1:4200/authorize"). 😉 Is that what appear? And as noted (in the comment), had you registered it? 🧐

        About how your PC handle it, take a look here:

        while (context.Request.Url.AbsolutePath != RedirectUri.AbsolutePath)

         You code waits for the same 'RedirectUri's value and ignore everything else (keeps looping) until appearing. Can this even happen in your case? (your PC receives this value "corrected" by your hand!!!)

  • Здравко's avatar
    Здравко
    Legendary | Level 20

    Shy1 wrote:

    ...

    ...
                // Respond with a page which runs JS and sends URL fragment as query string
                // to TokenRedirectUri.
                using (var file = File.OpenRead("index.html"))
                {
                    file.CopyTo(context.Response.OutputStream);
                }
    ...

    Ok, let's take a look on above part of your code. Do you understand what exactly this code does and is the file "index.html" available?

    • Shy1's avatar
      Shy1
      Explorer | Level 3

      if I take an example from github, and just change the AppKey and AppSecret and set my port, then everything goes fine and I get the following error: an error occurred while sending the request at the moment Exchanging code for token 

      index.html at the project

       

      <html>
      <script type="text/javascript">
          function redirect() {
              // Append fragment as query string so that server can receive it.
              document.location.href = "/token?url_with_fragment=" + encodeURIComponent(document.location.href);
          }
      </script>
      <body onload="redirect()"/>
      </html>

      at this moment

      var tokenResult = await DropboxOAuth2Helper.ProcessCodeFlowAsync(redirectUri, ApiKey, ApiSecret, RedirectUri.ToString(), state);

       

      • Здравко's avatar
        Здравко
        Legendary | Level 20

        Shy1 wrote:

        ... and I get the following error: an error occurred while sending the request at the moment Exchanging code for token ...

        Are you sure you keep talking for the same thing? 🤔 I cannot find any place in your source code where you receive a authorization code (you're receiving access token only). In this context what actually you're trying to exchange??? 🧐

About Dropbox API Support & Feedback

Node avatar for Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

5,875 PostsLatest Activity: 2 months ago
325 Following

If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.

For more info on available support options for your Dropbox plan, see this article.

If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!