gpt4 book ai didi

ios - Freesound OAuth2 身份验证失败

转载 作者:行者123 更新时间:2023-12-01 22:42:20 25 4
gpt4 key购买 nike

我正在尝试使用原生 iOS NSURLSession 创建一个使用 OAuth2 身份验证的 iOS 应用程序URL 加载类。我使用此处的说明获得了访问 token :

http://www.freesound.org/docs/api/authentication.html



我随后启动应用程序并运行搜索查询
https://www.freesound.org/apiv2/search/text/?query=snare

请求 header 字段如下所示(注意我的访问 token 未过期,我已确认它与执行上述步骤时收到的相同)
{
"Authorization: Bearer" = MY_ACCESS_TOKEN;
}

这失败了:
{"detail": "Authentication credentials were not provided."}

响应 header 如下所示:
{
Allow = "GET, HEAD, OPTIONS";

Connection = "keep-alive";

"Content-Type" = "application/json";

Date = "Sat, 31 Jan 2015 13:56:32 GMT";

Server = "nginx/1.2.1";

"Transfer-Encoding" = Identity;

Vary = "Accept, Cookie";

"Www-Authenticate" = "Bearer realm=\"api\"";
}

有趣的是,这并不总是发生。如果我多次重复整个过程,删除中间的应用程序,它最终会起作用。一旦它工作,它将在我开发时继续工作。有时当我回到它时,比如说第二天,它停止工作,我需要重复这个删除和重新安装程序才能让它重新工作!

NSURLSession 上有一个身份验证质询委托(delegate)方法,如果实现,它将被调用。这是一个“服务器信任”挑战。这可能与它有关吗?您甚至会期待这种性质的身份验证挑战吗?上面提到的文档中没有提到它。

任何帮助将非常感激。

编辑

这就是搜索文本(“snare”)GET 调用的方式。

我基本上是通过 NSMutableURLRequest将 URL 设置为上述 ( https://www.freesound.org/apiv2/search/text/?query=snare)。 useAccessToken设置为 YES .
- (void)makeRequest:(NSMutableURLRequest *)request useAccessToken:(BOOL)useAccessToken completion:(CompletionBlock)completion {
NSAssert(completion, @"No completion block.");

if (useAccessToken) {
NSString *accessToken = [[ODMFreesoundTokenCache sharedCache] accessToken];
NSAssert(accessToken.length, @"No access token.");
[request addValue:accessToken forHTTPHeaderField:@"Authorization: Bearer"];
}

NSLog(@"Making request: %@ \n\nWith access token: %@", request, [[ODMFreesoundTokenCache sharedCache] accessToken]);

NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSInteger code = [(NSHTTPURLResponse *)response statusCode];
if (code == 200) {
if (!error) {
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"json: %@", json);
completion(json, error);
}
else {
completion(nil, error);
}
}
else {
NSString *reason = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSError *error = [NSError errorWithDomain:@"Request Error" code:code userInfo: reason ? @{NSLocalizedDescriptionKey : reason} : nil];
NSLog(@"error: %@", error);
completion(nil, error);
}
}];
[task resume];
}

最佳答案

文档中描述的 2 个身份验证流程对于设备来说不是“安全的”。使用 API key 需要将 key 存储在设备中。

他们支持的 OAuth2 流程 (authorization_code) 需要服务器到服务器调用来交换实际 token 的代码(此步骤:http://www.freesound.org/docs/api/authentication.html#step-3)。此调用需要另一个凭据(client_secret,您可能也不应该将其存储在设备中。

你需要一个服务器来为你协商这个。或翻译 code flow 的服务器进入 token一。 (此处图解:https://auth0.com/docs/protocols#5)。

关于ios - Freesound OAuth2 身份验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28252727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com