Как запретить дополнительное отображение кода доступа при использовании Google OAuth 2.0 - PullRequest
11 голосов
/ 26 сентября 2011

Я следовал http://googlemac.blogspot.com/2011/05/ios-and-mac-sign-in-controllers.html, чтобы разрешить пользователям использовать Google для входа в приложение для iPhone.После того, как я нажму кнопку «Разрешить доступ», я получу дополнительный экран с текстом «Пожалуйста, скопируйте этот код, переключитесь на свое приложение и вставьте его туда: (код в текстовом поле).»

Вот что у меня есть:

- (IBAction)googleLoginTapped:(UIButton *)sender
{
    [self loginToGoogle];
}

- (void)loginToGoogle 
{

    // For Google APIs, the scope strings are available
    // in the service constant header files.
    NSString *scope =@"https://www.googleapis.com/auth/userinfo.profile";

    // Typically, applications will hardcode the client ID and client secret
    // strings into the source code; they should not be user-editable or visible.

    // But for this sample code, they are editable.
    NSString *clientID = @"my clientID";
    NSString *clientSecret = @"my clientSecret";


    // Display the autentication view.
    SEL finishedSel = @selector(viewController:finishedWithAuth:error:);

    GTMOAuth2ViewControllerTouch *viewController;

    viewController = [GTMOAuth2ViewControllerTouch controllerWithScope:scope
                                                              clientID:clientID
                                                          clientSecret:clientSecret
                                                      keychainItemName:nil
                                                              delegate:self
                                                      finishedSelector:finishedSel];

    // For this sample, we'll force English as the display language.
    NSDictionary *params = [NSDictionary dictionaryWithObject:@"en"
                                                       forKey:@"hl"];

    viewController.signIn.additionalAuthorizationParameters = params;

    // Optional: display some html briefly before the sign-in page loads
    NSString *html = @"<html><body bgcolor=silver><div align=center>Loading sign-in page...</div></body></html>";
    viewController.initialHTMLString = html;

    viewController.signIn.shouldFetchGoogleUserProfile = YES;

    [self presentModalViewController:viewController animated:YES];
}

- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error
{
    if (error != nil) 
    {
        // Authentication failed (perhaps the user denied 

пожалуйста, посмотрите эту ссылку, это хорошо https://developers.google.com/accounts/docs/OAuth2InstalledApp

Ответы [ 8 ]

9 голосов
/ 26 апреля 2013

Я попробовал этот подход и работаю нормально, поместите это в ваш метод webViewDidFinishLoad:

if ([webView.request.URL.absoluteString rangeOfString:@"https://accounts.google.com/o/oauth2/approval?"].location != NSNotFound) {
    webView.hidden=YES;
}
6 голосов
/ 28 сентября 2011

Я нашел ответ. Первоначально я использовал идентификатор клиента для установленного приложения. Это не давало возможность настроить URI перенаправления. Он дал URI перенаправления по умолчанию urn: ietf: wg: oauth: 2.0: oob http://localhost. Поэтому, когда я отправил запрос на аутентификацию с использованием этого кода:

viewController = [GTMOAuth2ViewControllerTouch controllerWithScope:scope
                                                              clientID:clientID
                                                          clientSecret:clientSecret
                                                      keychainItemName:nil
                                                              delegate:self
                                                      finishedSelector:finishedSel];

Возвращен код успеха, который затем используется для авторизации собственных приложений. Пожалуйста, укажите здесь для получения дополнительной информации о возвращенных кодах или токенах.

Чтобы исправить мою проблему, я пошел дальше и использовал идентификатор клиента для веб-приложения. Это позволило мне явно установить URI перенаправления, а также установить для response_type токен вместо кода здесь:

https://accounts.google.com/o/oauth2/auth?
  client_id=21302922996.apps.googleusercontent.com&
  redirect_uri=https://www.example.com/back&
  scope=https://www.google.com/m8/feeds/&
  response_type=**token**

Таким образом, когда я аутентифицируюсь и redirect_uri возвращается с сервера, он приходит с «access_tocken», добавляемым в виде строки запроса, подобной этой:

https://www.example.com/back?access_token=returned_access_tocken

Теперь вы можете использовать код регулярного выражения:

-(void)checkForAccessToken:(NSString *)urlString {
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"access_token=(.*)&" options:0 error:&error];
    if (regex != nil) 
    {
        NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString options:0 range:NSMakeRange(0, [urlString length])];
        if (firstMatch) 
        {
            NSRange accessTokenRange = [firstMatch rangeAtIndex:1];
            NSString *accessToken = [urlString substringWithRange:accessTokenRange];
            accessToken = [accessToken stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            [_delegate accessTokenFoundGoogle:accessToken];
            accessTokenFound = YES;
        }
    }
}

чтобы получить код доступа и использовать его для запроса авторизации здесь:

"https://www.googleapis.com/oauth2/v1/userinfo?oauth_token=put_your_accesstoken_here" to send a request for authorization

Тогда вы можете просто отправить свой запрос и в этом случае получить информацию о профиле пользователя в формате JSON. Вы можете обратиться к этому вопросу и ответу , чтобы использовать графическое API Facebook для входа в систему. Затем просто измените код для работы с новым Google OAuth 2.0, используя предложения и URL-адреса запросов, которые я включил здесь. Просто предложите ускорить процесс преобразования кода для Facebook, создайте новый метод инициализации, подобный следующему:

- (id)initWithDelegate:(id<GoogleLoginDialogDelegate>)delegate;

- (id)initWithDelegate:(id<GoogleLoginDialogDelegate>)delegate 
{
    if ((self = [super initWithNibName:@"GoogleLoginDialog" bundle:[NSBundle mainBundle]])) {
        self.delegate = delegate;
    }
    return self;    
}

Так что вы можете легко работать с методами делегата из вашего логина Google. Если вы внимательно последуете примеру Facebook, у вас должна быть отличная возможность входа в Google с OAuth!

5 голосов
/ 06 апреля 2012

Оказывается, это довольно просто. В обратном вызове входа в систему просто отклоните и удалите viewController из родительского контроллера представления.

- (void)viewController:(UIViewController *)viewController
      finishedWithAuth:(GTMOAuth2Authentication *)auth
                 error:(NSError *)error
{
    if (error == nil) {
        // Get rid of the login view.
        // self.parentViewController was saved somewhere else and is the parent
        // view controller of the view controller that shows the google login view.
        [self.parentViewController dismissViewControllerAnimated:NO completion:nil];
        [viewController removeFromParentViewController];

        // Tell the delegate that the user successfully logged in ...
    } else {
        // Error handling code ...
    }
}
1 голос
/ 09 апреля 2013

Я исправил это, вложив контроллер вида в UINavigationController.Понятия не имею, почему это сработало, но это сработало.

Так что вместо

[self presentModalViewController:viewController animated:YES];

... используйте

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self presentModalViewController:navigationController animated:YES];
0 голосов
/ 29 января 2016

После, по крайней мере, 20 часов настройки, я наконец запустил это. Я также ранее импортировал свой файл swift в мой файл GTMOAuth2ViewControllerTouch.m. Не уверен, что это повлияло, но я добавил:

    #import "myBundleId-Swift.h"

Затем в файле viewController.swift мне нужно было добавить последние 2 строки:

 // Handle completion of the authorization process, and updates the Drive service
// with the new credentials.
func viewController(viewController: GTMOAuth2ViewControllerTouch , finishedWithAuth authResult: GTMOAuth2Authentication, error:NSError? ) {
    if let error = error
    {
        self.showAlert("Authentication Error", message:error.localizedDescription)
        self.driveService.authorizer = nil
    } else {
        print("Authentication success")
        self.driveService.authorizer = authResult
//This where we need to get rid of the copy the code screen:
        self.parentViewController?.dismissViewControllerAnimated(false, completion:nil)
        viewController.removeFromParentViewController()
    }
}

Это избавило от копирования этого кода экрана.

0 голосов
/ 06 мая 2015

Я попробовал этот трюк, и он заработал ...

замените веб-просмотр shouldStartLoadWithRequest следующим методом в GTMOAuth2ViewControllerTouch.h . Он не будет отображать кодовую страницу аутентификации.

*- (BOOL)webView:(UIWebView *)webView
  shouldStartLoadWithRequest:(NSURLRequest *)request
              navigationType:(UIWebViewNavigationType)navigationType {
    if (!hasDoneFinalRedirect_)
    {
        hasDoneFinalRedirect_ = [signIn_ requestRedirectedToRequest:request];

        if ([request.URL.absoluteString rangeOfString:@"https://accounts.google.com/o/oauth2/approval?"].location != NSNotFound)
        {
            self.redirectView.frame=[UIScreen mainScreen].bounds;
            //webView.frame=[UIScreen mainScreen].bounds;
            [self.activityView startAnimating];
            [webView addSubview:self.redirectView];

            return YES;
        }
        else if(hasDoneFinalRedirect_) {
            // signIn has told the view to close
            return NO;
        }
    }

    return YES;
}*

в этом я добавляю свой собственный пользовательский вид (redirectView) на эту страницу аутентификации, проверяя этот URL-адрес утверждения https://accounts.google.com/o/oauth2/approval?

и Вы также должны добавить ActivityView в xib GTMOAuth2ViewControllerTouch, чтобы показать загрузчик при перенаправлении обратно в приложение.

0 голосов
/ 20 сентября 2013

при создании идентификатора клиента. Выберите веб-приложение вместо установленного, это решит вашу проблему.

счастливого кодирования :)

0 голосов
/ 27 сентября 2011

При использовании gtm-oauth2 для входа в службы Google убедитесь, что при регистрации проекта Консоль Google в разделе доступа к API указано, что идентификатор клиента выдан для установленного приложение.Это описано в документации gtm-oauth2 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...