简短的故事
使用iOS的gtm-oauth2和Symfony2中的FOSOAuthServerBundle来实现我自己的Oauth2服务器我没有调用callBack finishedSelector
。
这是创建“特殊”ViewController的地方:
GTMOAuth2ViewControllerTouch * viewController;
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:myAuth
authorizationURL:authURL
keychainItemName:nil
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
可能导致finishedSelector(实现的方法viewController:finishedWithAuth:error
)不被调用的原因是什么?
我得到的行为是登录页面被正确呈现,但它作为整个Web应用程序的起点,在登录后呈现其余页面,而不是将控件返回到finishedSelector和最后,到必须管理APP工作流程继续的视图控制器。
LONG STORY
在Symfony2中使用gtm-oauth2和FOSOAuthServerBundle时,我遇到了尝试使arquitecture捕获登录并从我的iOS APP加载经过身份验证的会话的问题。
我遵循gtm-oauth2 documentation中描述的说明,尤其是Signing in to non-Google Services部分。
执行那里描述的内容,我有这种方法来创建auth
对象:
- (GTMOAuth2Authentication * ) authForMyAPP
{
//This URL is defined by the individual 3rd party APIs, be sure to read their documentation
NSString * url_string = @"http://myHost/oauth/v2/token";
NSURL * tokenURL = [NSURL URLWithString:url_string];
// We'll make up an arbitrary redirectURI. The controller will watch for
// the server to redirect the web view to this URI, but this URI will not be
// loaded, so it need not be for any actual web page. This needs to match the URI set as the
// redirect URI when configuring the app.
NSString * redirectURI = @"http://myHost/oauth/v2/falseCallBack";
GTMOAuth2Authentication * myAuth;
myAuth = [GTMOAuth2Authentication authenticationWithServiceProvider:@"MyAPP"
tokenURL:tokenURL
redirectURI:redirectURI
clientID:kMyClientID
clientSecret:kMyClientSecret
];
//[myAuth setTokenType:@"Bearer"];
return myAuth;
}
然后,此方法创建“特殊”viewController,它应该处理登录页面的呈现并在执行登录时返回控件:
- (void)signInToMyAPP()
{
GTMOAuth2Authentication *myAuth = [self authForMyAPP];
NSString* auth_string = @"http://127.0.0.1/~pgbonino/Symfony/web/app.php/oauth/v2/auth";
NSURL * authURL = [NSURL URLWithString:auth_string];
// Display the authentication view
// Creates the "special" viewController passing the `auth` object, the authorization URL and the finishedSelector
GTMOAuth2ViewControllerTouch * viewController;
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:myAuth
authorizationURL:authURL
keychainItemName:nil
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
[self.navigationController pushViewController:viewController animated:YES];
}
最后,我有用于finishedSelector的方法。一旦正确执行登录并且身份验证成功(或者出现错误),就应该调用它。这就是我没有完成的事情:
- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
finishedWithAuth:(GTMOAuth2Authentication *)myAuth
error:(NSError *)error
{
if (error != nil)
{
// Authentication failed
UIAlertView *alertView = [ [UIAlertView alloc] initWithTitle:@"Authorization Failed"
message:[error localizedDescription]
delegate:self
cancelButtonTitle:@"Dismiss"
otherButtonTitles:nil];
[alertView show];
}
else
{
// Authentication succeeded
// Assign the access token to the instance property for later use
//self.accessToken = myAuth.accessToken;
[myAuth setShouldAuthorizeAllRequests:YES];
[[Singleton sharedSingleton] setAuth:myAuth];
// Display the access token to the user
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authorization Succeeded"
message:[NSString stringWithFormat:@"Access Token: %@", myAuth.accessToken]
delegate:self
cancelButtonTitle:@"Dismiss"
otherButtonTitles:nil];
[alertView show];
}
}
这一切都应该在Web视图中呈现我的登录页面并捕获成功登录以调用viewController:finishedWithAuth:error
并将会话保存在某个共享对象中。
然而,我得到的行为是我在Web视图中呈现登录,我正确登录,而不是调用委托选择器,它通常只登录应用程序,下一页加载到Web视图,就像它在普通浏览器中一样。所以不执行回调。
为什么我没有调用选择器?有什么想法吗?
重要说明:Oauth2服务器运行正常:如果我从Safari调用令牌URL和callBack网址,一切运行良好。令牌和授权码正确保存在数据库中。
答案 0 :(得分:0)
算了。
只是我。
在config.yml
中将此参数设置为true时,OAuth2将无法与Symfony2和FOSUserBundle一起使用:
always_use_default_target_path: false