-1

ショートストーリー

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:errorfinishedSelector (実装されたメソッド) が呼び出されない理由は何ですか?

私が得た動作は、ログイン ページが適切にレンダリングされることですが、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 を呼び出すと、すべて正常に機能します。トークンと認証コードがデータベースに正しく保存されます。

4

1 に答える 1

0

忘れてください。

それは私だけでした。

でこのパラメーターが true に設定されている間、OAuth2 は Symfony2 と FOSUserBundle では機能しませんconfig.yml

always_use_default_target_path: false
于 2013-01-13T16:39:15.847 に答える