Forum Discussion

Daniel A.39's avatar
Daniel A.39
Explorer | Level 3
9 years ago
Solved

How to get OAuth2 access token from OAuth1 token and secret with API v2

All current users of our mobile app have OAuth1 token and secret stored for using their Dropbox account.  With the migration to API v2, we must use OAuth2 access tokens.  How can the OAuth1 token and secret be converted to an OAuth2 access token? The API v2 provides a route called /token/from_oauth1 which seems to provide a means to do this, but it requires an OAuth2 access token in order to work.  That makes no sense to me since it seems to require that you already have the answer in order to ask the question.  How can /token/from_oauth1 be used? And how can we convert our OAuth1 tokens and secrets to OAuth2 access tokens?

  • Greg-DB's avatar
    Greg-DB
    9 years ago

    No problem, that would look like this:

     

    [DropboxClientsManager setupWithAppKey:@"APP_KEY"];
    
    DBTransportClient *transportClient = [[DBTransportClient alloc] initWithAccessToken:nil
                                                                             selectUser:nil
                                                                              baseHosts:nil
                                                                              userAgent:nil
                                                                    backgroundSessionId:nil
                                                                          delegateQueue:nil
                                                                                 appKey:@"APP_KEY"
                                                                              appSecret:@"APP_SECRET"];
    [DropboxClientsManager authorizedClient:[[DropboxClient alloc] initWithTransportClient:transportClient]];
    [[DropboxClientsManager.authorizedClient.authRoutes tokenFromOauth1:@"OAUTH1_TOKEN_KEY" oauth1TokenSecret:@"OAUTH1_TOKEN_SECRET"] response:^(DBAUTHTokenFromOAuth1Result *result, DBAUTHTokenFromOAuth1Error *routeError, DBRequestError *error) {
        if (result) {
            NSLog(@"OAuth 2 access token: %@\n", result.oauth2Token);
        } else {
            NSLog(@"%@\n%@\n", routeError, error);
        }
    }];
  • Greg-DB's avatar
    Greg-DB
    Icon for Dropbox Staff rankDropbox Staff

    That is the right way to do this, but it looks like the curl example in the documentation for /2/auth/token/from_oauth1 is unfortunately incorrect. I'll let the team know to fix that.

     

    That endpoint actually uses app authentication, so an OAuth 2 access token isn't necessary. This is what the curl example should look like:

     

    curl -X POST https://api.dropboxapi.com/2/auth/token/from_oauth1 \
        -u "APP_KEY:APP_SECRET" \
        --header "Content-Type: application/json" \
        --data "{\"oauth1_token\": \"OAUTH1_TOKEN_KEY\",\"oauth1_token_secret\": \"OAUTH1_TOKEN_SECRET\"}"
    • Daniel A.39's avatar
      Daniel A.39
      Explorer | Level 3
      Thanks, Greg. That's great. I drilled down to the HTTP API to try to get to the bottom of it, but I really should have asked about the Objective C API, since that's what I use. In that case it looks like I need to call a method on the AUTHRoute object, but I don't see a way to get one of those without a DropboxClient, which requires authentication. Can you give a quick example for Objective C? Thanks!
      • Greg-DB's avatar
        Greg-DB
        Icon for Dropbox Staff rankDropbox Staff

        No problem, that would look like this:

         

        [DropboxClientsManager setupWithAppKey:@"APP_KEY"];
        
        DBTransportClient *transportClient = [[DBTransportClient alloc] initWithAccessToken:nil
                                                                                 selectUser:nil
                                                                                  baseHosts:nil
                                                                                  userAgent:nil
                                                                        backgroundSessionId:nil
                                                                              delegateQueue:nil
                                                                                     appKey:@"APP_KEY"
                                                                                  appSecret:@"APP_SECRET"];
        [DropboxClientsManager authorizedClient:[[DropboxClient alloc] initWithTransportClient:transportClient]];
        [[DropboxClientsManager.authorizedClient.authRoutes tokenFromOauth1:@"OAUTH1_TOKEN_KEY" oauth1TokenSecret:@"OAUTH1_TOKEN_SECRET"] response:^(DBAUTHTokenFromOAuth1Result *result, DBAUTHTokenFromOAuth1Error *routeError, DBRequestError *error) {
            if (result) {
                NSLog(@"OAuth 2 access token: %@\n", result.oauth2Token);
            } else {
                NSLog(@"%@\n%@\n", routeError, error);
            }
        }];

About Dropbox API Support & Feedback

Node avatar for Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.5,941 PostsLatest Activity: 5 days ago
351 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!