OSX Dropbox 同步 API 错误 - 无法验证 link 请求
OSX Dropbox Sync API Error - unable to verify link request
编码在 Swift 我在教程之后实现。
DBAccountManager 在 applicationDidFinishLaunching 上的 AppDelegate 中设置。
稍后,当用户在我的应用程序中激活保管箱支持时,我正在尝试 link 该帐户。
Window 面板显示,我的应用程序正在等待回调。
有时我没有得到一个 linked 帐户,即使用户登录并接受。
日志说
[错误] 无法验证 link 请求
当这发生在机器上时它不会工作,你可以重试再重试...
如果它有效,它就像一个魅力,将来我总是直接从图书馆获得 linked 帐户而无需登录 window。
这个错误是什么意思,我该怎么办?
AppDelegate:
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Dropbox API Key & Secret
let _appKey = "------"
let _appSecret = "------"
// Accountmanager
if (DBAccountManager.sharedManager() == nil)
{
let accountManager = DBAccountManager(appKey: _appKey, secret: _appSecret)
DBAccountManager.setSharedManager(accountManager)
}
....
}
我的 class 中的 linking,当用户单击以激活保管箱时:
internal func __start(parentWindow:NSWindow?, callback:((Bool) -> Void))
{
let am = DBAccountManager.sharedManager()
if am == nil
{
NSLog("Dropbox not available!")
callback!(false)
return
}
// link account
let linkedAccount = am!.linkedAccount
if (linkedAccount != nil)
{
// Already linked
DLog("Dropbox link found.")
let fileSystem = DBFilesystem(account: linkedAccount!)
DBFilesystem.setSharedFilesystem(fileSystem)
callback(true)
}
else
{
// link with window must be in mainthread
dispatch_async(dispatch_get_main_queue())
{
am!.linkFromWindow(parentWindow) {
account in
if (account != nil)
{
DLog("Dropbox linked")
let fileSystem = DBFilesystem(account: account!)
DBFilesystem.setSharedFilesystem(fileSystem)
callback(true)
}
else
{
DLog("NOT LINKED (Dropbox)")
callback(false)
} // if - else account
} // accountmanager block
} // dispatchblock main
} // if - else linkedaccount
}
这是完整的日志,应用程序没有做任何其他事情:
2015-02-23 10:25:39.443 TestApp[39226:30958267] Dropbox init
<<<< MediaValidator >>>> mv_ValidateRFC4281CodecId: Unrecognized codec 1.(null). Failed codec specific check.
<<<< MediaValidator >>>> mv_LookupCodecSupport: Unrecognized codec 1
[10:25:40.979] mv_LowLevelCheckIfVideoPlayableUsingDecoder signalled err=-12956 (kFigMediaValidatorError_VideoCodecNotSupported) (video codec 1) at line 1851
<<<< MediaValidator >>>> mv_TestCodecSupportUsingDecoders: Unrecognized codec 1
<<<< MediaValidator >>>> mv_ValidateRFC4281CodecId: Unrecognized codec 1.(null). Failed codec specific check.
<<<< MediaValidator >>>> mv_LookupCodecSupport: Unrecognized codec 1
[10:25:40.979] mv_LowLevelCheckIfVideoPlayableUsingDecoder signalled err=-12956 (kFigMediaValidatorError_VideoCodecNotSupported) (video codec 1) at line 1851
<<<< MediaValidator >>>> mv_TestCodecSupportUsingDecoders: Unrecognized codec 1
2015-02-23 10:25:43.873 TestApp[39226:30958267] [ERROR] unable to verify link request
2015-02-23 10:25:43.879 TestApp[39226:30958267] NOT LINKED (Dropbox)
我找到了一些东西,因为我找到了解决方法,甚至连 Dropbox 错误也消失了。
问题似乎是 NSUserDefaults 没有存储任何数据(不在内存中也不在磁盘上!)。由于 Dropbox 使用 NSUserDefaults 来检查之前和之后的状态,这杀死了整个过程。
随着 NSUserDefaults 恢复工作,似乎整个保管箱问题都消失了。
我有同样的问题[ERROR] unable to verify link request 经过长时间的研究和研究 DropBoxSDK 我发现状态 ID 时会发生此错误与键 KDBKLinkNonce 保存的值不同。每次在新会话中它都会生成新的状态 ID。请参阅下面 [[DBSession sharedSession] handleOpenURL:url] 方法的代码。
- (BOOL)handleOpenURL:(NSURL *)url {
NSString *expected = [NSString stringWithFormat:@"%@://%@/", [self appScheme], kDBDropboxAPIVersion];
if (![[url absoluteString] hasPrefix:expected]) {
return NO;
}
NSArray *components = [[url path] pathComponents];
NSString *methodName = [components count] > 1 ? [components objectAtIndex:1] : nil;
if ([methodName isEqual:@"connect"]) {
NSDictionary *params = [DBSession parseURLParams:[url query]];
NSString *token = [params objectForKey:@"oauth_token"];
NSString *secret = [params objectForKey:@"oauth_token_secret"];
NSString *userId = [params objectForKey:@"uid"];
NSString *state = [params objectForKey:@"state"];
NSString *nonce = [[NSUserDefaults standardUserDefaults] objectForKey:kDBLinkNonce];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kDBLinkNonce];
[[NSUserDefaults standardUserDefaults] synchronize];
if (![nonce isEqual:state]) {
DBLogError(@"unable to verify link request");
return NO;
}
[self updateAccessToken:token accessTokenSecret:secret forUserId:userId];
} else if ([methodName isEqual:@"cancel"]) {
DBLogInfo(@"DropboxSDK: user cancelled Dropbox link");
}
return YES; }
如需进一步参考,请检查此 link dropbox-sdk-ios
编码在 Swift 我在教程之后实现。
DBAccountManager 在 applicationDidFinishLaunching 上的 AppDelegate 中设置。
稍后,当用户在我的应用程序中激活保管箱支持时,我正在尝试 link 该帐户。 Window 面板显示,我的应用程序正在等待回调。
有时我没有得到一个 linked 帐户,即使用户登录并接受。
日志说 [错误] 无法验证 link 请求
当这发生在机器上时它不会工作,你可以重试再重试... 如果它有效,它就像一个魅力,将来我总是直接从图书馆获得 linked 帐户而无需登录 window。
这个错误是什么意思,我该怎么办?
AppDelegate:
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Dropbox API Key & Secret
let _appKey = "------"
let _appSecret = "------"
// Accountmanager
if (DBAccountManager.sharedManager() == nil)
{
let accountManager = DBAccountManager(appKey: _appKey, secret: _appSecret)
DBAccountManager.setSharedManager(accountManager)
}
....
}
我的 class 中的 linking,当用户单击以激活保管箱时:
internal func __start(parentWindow:NSWindow?, callback:((Bool) -> Void))
{
let am = DBAccountManager.sharedManager()
if am == nil
{
NSLog("Dropbox not available!")
callback!(false)
return
}
// link account
let linkedAccount = am!.linkedAccount
if (linkedAccount != nil)
{
// Already linked
DLog("Dropbox link found.")
let fileSystem = DBFilesystem(account: linkedAccount!)
DBFilesystem.setSharedFilesystem(fileSystem)
callback(true)
}
else
{
// link with window must be in mainthread
dispatch_async(dispatch_get_main_queue())
{
am!.linkFromWindow(parentWindow) {
account in
if (account != nil)
{
DLog("Dropbox linked")
let fileSystem = DBFilesystem(account: account!)
DBFilesystem.setSharedFilesystem(fileSystem)
callback(true)
}
else
{
DLog("NOT LINKED (Dropbox)")
callback(false)
} // if - else account
} // accountmanager block
} // dispatchblock main
} // if - else linkedaccount
}
这是完整的日志,应用程序没有做任何其他事情:
2015-02-23 10:25:39.443 TestApp[39226:30958267] Dropbox init
<<<< MediaValidator >>>> mv_ValidateRFC4281CodecId: Unrecognized codec 1.(null). Failed codec specific check.
<<<< MediaValidator >>>> mv_LookupCodecSupport: Unrecognized codec 1
[10:25:40.979] mv_LowLevelCheckIfVideoPlayableUsingDecoder signalled err=-12956 (kFigMediaValidatorError_VideoCodecNotSupported) (video codec 1) at line 1851
<<<< MediaValidator >>>> mv_TestCodecSupportUsingDecoders: Unrecognized codec 1
<<<< MediaValidator >>>> mv_ValidateRFC4281CodecId: Unrecognized codec 1.(null). Failed codec specific check.
<<<< MediaValidator >>>> mv_LookupCodecSupport: Unrecognized codec 1
[10:25:40.979] mv_LowLevelCheckIfVideoPlayableUsingDecoder signalled err=-12956 (kFigMediaValidatorError_VideoCodecNotSupported) (video codec 1) at line 1851
<<<< MediaValidator >>>> mv_TestCodecSupportUsingDecoders: Unrecognized codec 1
2015-02-23 10:25:43.873 TestApp[39226:30958267] [ERROR] unable to verify link request
2015-02-23 10:25:43.879 TestApp[39226:30958267] NOT LINKED (Dropbox)
我找到了一些东西,因为我找到了解决方法,甚至连 Dropbox 错误也消失了。
问题似乎是 NSUserDefaults 没有存储任何数据(不在内存中也不在磁盘上!)。由于 Dropbox 使用 NSUserDefaults 来检查之前和之后的状态,这杀死了整个过程。
随着 NSUserDefaults 恢复工作,似乎整个保管箱问题都消失了。
我有同样的问题[ERROR] unable to verify link request 经过长时间的研究和研究 DropBoxSDK 我发现状态 ID 时会发生此错误与键 KDBKLinkNonce 保存的值不同。每次在新会话中它都会生成新的状态 ID。请参阅下面 [[DBSession sharedSession] handleOpenURL:url] 方法的代码。
- (BOOL)handleOpenURL:(NSURL *)url {
NSString *expected = [NSString stringWithFormat:@"%@://%@/", [self appScheme], kDBDropboxAPIVersion];
if (![[url absoluteString] hasPrefix:expected]) {
return NO;
}
NSArray *components = [[url path] pathComponents];
NSString *methodName = [components count] > 1 ? [components objectAtIndex:1] : nil;
if ([methodName isEqual:@"connect"]) {
NSDictionary *params = [DBSession parseURLParams:[url query]];
NSString *token = [params objectForKey:@"oauth_token"];
NSString *secret = [params objectForKey:@"oauth_token_secret"];
NSString *userId = [params objectForKey:@"uid"];
NSString *state = [params objectForKey:@"state"];
NSString *nonce = [[NSUserDefaults standardUserDefaults] objectForKey:kDBLinkNonce];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kDBLinkNonce];
[[NSUserDefaults standardUserDefaults] synchronize];
if (![nonce isEqual:state]) {
DBLogError(@"unable to verify link request");
return NO;
}
[self updateAccessToken:token accessTokenSecret:secret forUserId:userId];
} else if ([methodName isEqual:@"cancel"]) {
DBLogInfo(@"DropboxSDK: user cancelled Dropbox link");
}
return YES; }
如需进一步参考,请检查此 link dropbox-sdk-ios