我尝试使用Trakt API获取电视节目和其他数据列表。但是,我仍然坚持使用Trakt对我的应用进行身份验证。我有我的API密钥,秘密和重定向URI,但我正在努力如何授权我的应用程序。我尝试过以下方法:
方法1,使用Trakt中的示例代码:
-(void)authorisation{
NSString *redirectURI = @"http://myappredirect://";
NSString *clientID = @"MY_CLIENT_ID";
NSString *clientSecret = @"MY_CLIENT_SECRET";
NSString *username = @"USERNAME";
NSString *authURL = [NSString stringWithFormat:@"https://trakt.tv/oauth/authorize?response_type=code&client_id=%@&redirect_uri=%@&state=state&username=%@", clientID, redirectURI, username];
NSURL *URL = [NSURL URLWithString:authURL];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[[UIApplication sharedApplication] openURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
// Handle error...
return;
}
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSLog(@"Response HTTP Status code: %ld\n", (long)[(NSHTTPURLResponse *)response statusCode]);
NSLog(@"Response HTTP Headers:\n%@\n", [(NSHTTPURLResponse *)response allHeaderFields]);
}
NSString* body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Response Body:\n%@\n", body);
}];
[task resume];
}
这会在我的iPhone上打开Safari,成功加载网页,Trakt要求为我的应用授权我的帐户。我点按了“授权”#39;然后Safari加载一个网址' myappredirect//?code=a_really_long_string_of_characters
",但出现错误
Safari无法打开页面,因为无法找到服务器。
当我在Safari中输入myappredirect://
时,我的应用程序会打开,因此我想知道Safari加载的网址是否不正确,因为它在双重//之前缺少分号?
所以我尝试在我的应用中添加UIWebView
并在其中加载网址。它会加载网址,但这次点击“授权”后,它不会更改网页。 UIWebView
代理人webViewDidStartLoad
确实告诉我在点击“授权”后会加载一个页面,但屏幕上没有任何更改。
方法2,使用OAuth2Client:
-(void)setupWebview{
webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
webView.backgroundColor = [UIColor greenColor];
webView.delegate = self;
[self.view addSubview:webView];
}
-(void)webViewDidStartLoad:(UIWebView *)webView{
NSLog(@"webViewDidStartLoad");
}
-(void)secondMethod{
NSString *redirectURI = @"http://myappredirect://";
NSString *clientID = @"MY_CLIENT_ID";
NSString *clientSecret = @"MY_CLIENT_SECRET";
NSString *username = @"USERNAME";
NSString *authURL = [NSString stringWithFormat:@"https://api-v2launch.trakt.tv/oauth/authorize?response_type=code&client_id=%@&redirect_uri=%@&state=state&username=%@", clientID, redirectURI, username];
NSString *tokenURL = @"https://api-v2launch.trakt.tv";
[[NXOAuth2AccountStore sharedStore] setClientID:clientID
secret:clientSecret
authorizationURL:[NSURL URLWithString:authURL]
tokenURL:[NSURL URLWithString:tokenURL]
redirectURL:[NSURL URLWithString:redirectURI]
forAccountType:@"Trakt"];
[[NXOAuth2AccountStore sharedStore] requestAccessToAccountWithType:@"Trakt"
withPreparedAuthorizationURLHandler:^(NSURL *preparedURL){
// Open a web view or similar
[webView loadRequest:[NSURLRequest requestWithURL:preparedURL]];
}];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];
[[NSNotificationCenter defaultCenter] addObserverForName:NXOAuth2AccountStoreAccountsDidChangeNotification
object:[NXOAuth2AccountStore sharedStore]
queue:nil
usingBlock:^(NSNotification *aNotification){
// Update your UI
NSLog(@"Success");
}];
[[NSNotificationCenter defaultCenter] addObserverForName:NXOAuth2AccountStoreDidFailToRequestAccessNotification
object:[NXOAuth2AccountStore sharedStore]
queue:nil
usingBlock:^(NSNotification *aNotification){
NSError *error = [aNotification.userInfo objectForKey:NXOAuth2AccountStoreErrorKey];
// Do something with the error
NSLog(@"Error");
}];
}
在这里,我不确定令牌网址是什么。同样,我的UIWebView
完全加载了网址,但在我按下“授权”后,它并没有更改其网页。委托方法webViewDidStartLoad
确实告诉我它加载了另一个页面,但屏幕上没有任何变化。此外,两个NXOAuth2
通知都没有发送。
我是OAuth2的新手,非常感谢任何人可能提供的任何帮助。如果这是一个愚蠢的问题,我很抱歉,我真的很难做什么,并且在我授权Trakt之后为什么Safari不会打开我的应用程序感到困惑。
感谢。
答案 0 :(得分:3)
NSString *redirectURI = @"myappredirect://";
而不是
NSString *redirectURI = @"http://myappredirect://";
答案 1 :(得分:2)
使用UIWebView,当url以你的重定向url开头并从url获取参数授权代码时,你可以在UIWebView委托shouldStartLoadWithRequest
中断加载,并使用" get token url"并致电[[NXOAuth2AccountStore sharedStore] handleRedirectURL:getTokenURL];
可能不是最好的方式,但它对我有用。 :)
英语不是我的第一语言,所以请原谅任何错误。 我希望这可以帮到你。
答案 2 :(得分:0)
我是这样做的。
您需要定义一个将打开您的应用而不是浏览器的网址方案,这对于oauth流程结束时的重定向非常有用。
让我们称它为yoururlscheme
示例,但你可以选择你想要的任何东西(例如:小写的“yourappname”,甚至你的包标识符“com.example.yourappname”)
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>yoururlscheme</string>
</array>
</dict>
</array>
yoururlscheme://oauth/token
列表中。import SafariServices
class YourViewController: UIViewController {
var oauthSession: SFAuthenticationSession? = nil
func signIn() {
let clientId = "" // your client id
let redirectUri = "yoururlscheme://oauth/token"
let oauthURL = "https://trakt.tv/oauth/authorize?response_type=code&client_id=\(clientId)&redirect_uri=\(redirectUri)"
oauthSession = SFAuthenticationSession(url: oauthURL, callbackURLScheme: redirectUri) { (url, error) in
guard let url = url,
let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false),
let queryItems = urlComponents.queryItems,
let code = queryItems.first(where: {$0.name == "code"})?.value else {
return
}
// Do whatever you want with the token now
print("code: \(code)")
}
oauthSession?.start()
}
}