在没有登录提示的情况下自动登录核心 Api 上的 Dropbox 帐户

Auto Login Dropbox account on Core Api without Login Prompt

我是 iOs 开发的新手,我正在创建一个使用我自己的保管箱帐户的应用程序。 我希望我的应用程序自动登录到我的帐户,以便能够在我的应用程序文件夹中修改和添加文件。 文档说我应该调用:[[DBSession sharedSession]linkFromController:viewController]; 才能登录。但我不想向用户显示登录提示,因为我只希望它自动登录到我的 Dropbox 帐户。有什么方法可以在不违反保管箱 api 标准的情况下实现后台登录。顺便说一下,我使用的是 Core API。请帮助我。

Dropbox API 旨在让每个用户 link 拥有自己的 Dropbox 帐户,以便与自己的文件进行交互。但是,从技术上讲,仅连接到一个帐户是可能的。出于各种技术和安全原因,SDK 不提供对它的明确支持,我们不建议这样做。

但是,如果您确实想走这条路,您可以手动为您的应用使用现有的访问令牌,而不是启动授权流程。 (注意不要撤销它,例如通过 https://www.dropbox.com/account/security 。)在 iOS 核心 SDK 中,您需要使用:

- (void)updateAccessToken:(NSString *)token accessTokenSecret:(NSString *)secret forUserId:(NSString *)userId;

同样,这不是一个好主意。由于这将是一个客户端应用程序,您应用程序的任何恶意用户都可以提取访问令牌并使用它来绕过您的应用程序试图强制执行的任何访问限制。例如,他们可以访问他们不应该访问的内容,或者使用其他用户可以访问的恶意负载添加或替换内容。

抱歉,我无法遵循已接受的答案,而且 Greg 似乎非常不愿意提供示例代码,因为 Dropbox 不建议以这种方式使用密钥。对于需要快速解决方案(例如)将 zip 文件上传到单个保管箱帐户而不使用我认为相当不透明的保管箱 iOS SDK API 的任何人,以下工作(DropboxOAuthKey 是密钥您按下按钮在应用程序控制台中生成):

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @{
                                                       @"Authorization" : [NSString stringWithFormat:@"Bearer %@", DropboxOAuthKey],
                                                       @"Content-Type"  : @"application/zip"
                                                       };

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: sessionConfiguration delegate: self delegateQueue: [NSOperationQueue mainQueue]];
self.request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://api-content.dropbox.com/1/files_put/auto/%@?overwrite=false",fileName]]];
[self.request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:zippedPath];
[self.request setHTTPMethod:@"PUT"];
[self.request setHTTPBody:data];
[self.request setTimeoutInterval:1000];

NSURLSessionDataTask *doDataTask = [defaultSession dataTaskWithRequest:self.request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (!error){
                NSLog(@"WORKED!!!!");
            } else {
                NSLog(@"ERROR: %@", error);
            }
        }];

[doDataTask resume];