Ошибка 403 - Это ошибка. Ошибка: disallowed_useragent

Я пытаюсь авторизовать пользователя для Google calendar API в приложении для IOS. Я использую функцию OAuth2 от Google для аутентификации пользователей. Страница авторизации открывается с ошибкой 403 с описанием:

Этому агенту пользователя не разрешено делать запрос авторизации OAuth к Google, так как он классифицируется как встроенный агент пользователя (также известный как web-view). Согласно нашей политике, только браузерам разрешено отправлять запросы на авторизацию в Google. Мы предлагаем несколько библиотек и примеров для нативных приложений для выполнения запроса авторизации в браузере.

Я выполнил ту же процедуру, которая описана в этой ссылке: https://developers.google.com/google-apps/calendar/quickstart/ios.

Вместо того, чтобы смотреть мой код, лучше посмотреть на эту ссылку: https://developers.google.com/google-apps/calendar/quickstart/ios. потому что я скопировал то же самое в свое приложение.

Ниже приведены мои clientId и keyChainItemName:

static NSString *const kKeychainItemName = @"Google Calendar API";
static NSString *const kClientID = @"954370342601-sgl8k0jrbqdeagea9v6vfu3tspte96ci.apps.googleusercontent.com";
Комментарии к вопросу (5)

В моем случае я использовал родной web view для входа в google, я обнаружил способ, что вы должны предоставить user agent в webview, это сработало для меня. Попробуйте следующий код, я уверен, что он сработает.

Добавьте код в приложение didFinishLaunchingWithOptions.

Objective C

 NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", @"UserAgent", nil];
 [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

Swift 3.0

let dictionaty = NSDictionary(object: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", forKey: "UserAgent" as NSCopying)
UserDefaults.standard.register(defaults: dictionaty)
Комментарии (3)

Я также столкнулся с этой проблемой в своем проекте cordova. Вы можете попробовать следующее: Просто добавьте это в ваш config.xml, у меня сработало.

Комментарии (4)

Короткий ответ заключается в том, что Google обновила свои ограничения безопасности для потока OAuth. Они не собираются разрешать нативным веб-просмотрам инициировать поток OAuth, а скорее поощряют людей использовать для этого браузеры ОС. В вашем случае, вероятно, придется подождать, пока SDK календаря Google обновит свой код, чтобы подчиниться новому рекомендованному потоку. Более подробную информацию можно найти в блоге Google.

EDIT : Я попытался создать кроссплатформенный плагин, который оборачивает родные SDK для входа в Google для использования в приложении Xamarin forms. Дополнительную информацию можно найти здесь.

Комментарии (4)

Как упоминалось в предыдущих ответах, SFSafariViewController - это выход, но для тех, кто все еще использует WKWebView для OAuth авторизации, есть простой обходной путь.

Просто измените customUserAgent на один из list или установите его в произвольное значение. После этого ошибка disallowed_useragent исчезнет:

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
// Check for selector availability, as it is available only on iOS 9+
if ([webView respondsToSelector:@selector(setCustomUserAgent:)]) {
    webView.customUserAgent = @"MyCustomUserAgent";
}

Для изменения User-Agent в UIWebView вы можете посмотреть этот ответ.

Но будьте осторожны, так как некоторый код бэкенда может зависеть от значения заголовка User-Agent.

Комментарии (1)

Получил ту же проблему. Решилась установкой следующего свойства для объекта webview:

webview.getSettings().setUserAgentString("Chrome/56.0.0.0 Mobile");

Надеюсь, это поможет.

Комментарии (0)

По умолчанию, если у вас нет приложения google, google SDK открывает вход в систему внутри UIWebView, когда мы инициируем вход с помощью следующего метода.

        [[GIDSignIn sharedInstance] signIn];

Я просто добавил одну строку перед этим, которая выглядит следующим образом.

        [[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];

Теперь google'не авторизуется с помощью всплывающего окна UIWebView. Вместо этого он открывается в браузере Safari. И теперь все работает как раньше.

Комментарии (2)

Существует обходной путь решения этой проблемы после недавних изменений в политике Google OAuth.

После интеграции Google Sign и включения Google Calendar API я смог работать с Google Calendar API для получения и добавления событий календаря. Нам просто нужно установить авторизатор для GTLServiceCalendar, который получается после входа в Google.

service.authorizer = user.authentication.fetcherAuthorizer().

Вот фрагменты кода Google GIDSignIn, а затем получение событий календаря.

import GoogleAPIClient
import GTMOAuth2
import UIKit
import GoogleSignIn

class ViewController: UIViewController, GIDSignInUIDelegate, GIDSignInDelegate {

  private let kApiKey = "AIzaXXXXXXXXXXXXXXXXXXXXXXX"

  // If modifying these scopes, delete your previously saved credentials by
  // resetting the iOS simulator or uninstall the app.
  private let scopes = [kGTLAuthScopeCalendar]
  private let service = GTLServiceCalendar()

  override func viewDidLoad() {
      super.viewDidLoad()

      service.apiKey = kApiKey

      GIDSignIn.sharedInstance().uiDelegate = self
      GIDSignIn.sharedInstance().scopes = scopes
      GIDSignIn.sharedInstance().signIn()
      GIDSignIn.sharedInstance().delegate = self
  }

  func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {

      if user != nil {
           print("\(user)")
           service.authorizer = user.authentication.fetcherAuthorizer()
           fetchEvents()
      }
  }

 // Construct a query and get a list of upcoming events from the user calendar
   func fetchEvents() {

        let query = GTLQueryCalendar.queryForEventsList(withCalendarId: "primary")
        query?.maxResults = 20
        query?.singleEvents = true
        query?.orderBy = kGTLCalendarOrderByStartTime

        service.executeQuery(query!, delegate: self, didFinish: #selector(ViewController.displayResultWithTicket(ticket:finishedWithObject:error:)))
   }

// Display the start dates and event summaries in the UITextView
    func displayResultWithTicket(
         ticket: GTLServiceTicket,
        finishedWithObject response : GTLCalendarEvents,
        error : NSError?) {

        if let error = error {
            showAlert(title: "Error", message: error.localizedDescription)
            return
        }

        var eventString = ""

        if let events = response.items(), !events.isEmpty {
            for event in events as! [GTLCalendarEvent] {
                print(event)
             }
        } else
                print("No upcoming events found.")
        }
    }

    }

Вот как мой раздел учетных данных отображается в Google Dev Console.

Комментарии (9)

Посмотрите на этот вопрос. Вместо этого используйте GTMAppAuth.

Комментарии (1)

Google решил больше не позволять встроенным браузерам обрабатывать аутентификацию oAuth. Лучший способ - использовать SFSafariViewController на iOS. Вот как можно решить эту проблему с помощью CloudRail SDK:

В Objective-C:

@implementation AppDelegate

  // This method will receive the redirect URI after the authentication process was
  // successfull
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

  // Here we pass the response to the SDK which will automatically
  // complete the authentication process.
  [[NSNotificationCenter defaultCenter] postNotificationName:@"kCloseSafariViewControllerNotification" object:url];

  return YES;
}

@end

и Swift:

// This method will receive the redirect URI after the authentication process was
// successfull
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {

    if (sourceApplication == "com.apple.SafariViewService") {
        // Here we pass the response to the SDK which will automatically
        // complete the authentication process.
        NSNotificationCenter.defaultCenter().postNotificationName("kCloseSafariViewControllerNotification", object: url)
        return true
    }
    return true
}

Полную статью в блоге, посвященную этой проблеме, можно найти здесь: Решение проблемы 'disallowed_useragent' для сервисов Google

Комментарии (1)

Это работает для меня

mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 4.1.1; Galaxy Nexus Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19");
Комментарии (0)

После завершения входа в систему google sign-in, используйте currentUser для получения fetcherAuthorizer, который можно использовать как авторизатор для Google Drive Service.

После этого вы можете использовать Google Drive Service в обычном режиме:

GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;

if(googleUser != nil){
    self.service.authorizer = googleUser.authentication.fetcherAuthorizer;
    [self listFiles];

}
Комментарии (0)

Я решил эту проблему за 1 год :-) шучу. просто добавьте следующую строку в предпочтения в config.xml

Пожалуйста, обратите внимание, что я решил эту проблему входа в Google с помощью браузера Inapp.

Спасибо

Комментарии (0)