ショートストーリー
iOS 用の gtm-oauth2 と Symfony2 の FOSOAuthServerBundle を使用して、独自の Oauth2 サーバーを実装すると、callBackfinishedSelector
が呼び出されません。
これは、「特別な」ViewController が作成される場所です。
GTMOAuth2ViewControllerTouch * viewController;
viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:myAuth
authorizationURL:authURL
keychainItemName:nil
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
viewController:finishedWithAuth:error
finishedSelector (実装されたメソッド) が呼び出されない理由は何ですか?
私が得た動作は、ログイン ページが適切にレンダリングされることですが、Web アプリケーション全体の開始点として機能し、コントロールを finishedSelector に返す代わりに、ログイン後に残りのページをレンダリングし、最後に、 APPワークフローの継続を管理する必要があるView Controllerに。
長い話
Symfony2 で gtm-oauth2 と FOSOAuthServerBundle を使用して、ログインをキャッチし、iOS APP から認証されたセッションをロードするアーキテクチャを作成しようとすると問題が発生します。
gtm-oauth2 のドキュメント、特にGoogle 以外のサービスへのサインインの部分に記載されている手順に従っています。
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 URL を呼び出すと、すべて正常に機能します。トークンと認証コードがデータベースに正しく保存されます。