Подтвердить что ты не робот

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

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

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

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

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

ниже - my clientId и keyChainItemName:

static NSString *const kKeychainItemName = @"Google Calendar API";
static NSString *const kClientID = @"954370342601-sgl8k0jrbqdeagea9v6vfu3tspte96ci.apps.googleusercontent.com";
4b9b3361

Ответ 1

В моем случае я использовал собственный веб-вид для входа в систему с помощью Google, я выяснил, каким образом вы должны предоставить пользовательский агент для веб-просмотра, он работал для меня. Попробуйте приведенный ниже код. Я уверен, что это сработает.

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

Цель 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)

Ответ 2

<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />

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

Ответ 3

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

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

Ответ 4

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

Просто измените customUserAgent на один из списка или установите для него произвольное значение. После этого ошибка 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.

Ответ 5

У вас такая же проблема. Разрешено, установив для объекта webview следующее свойство:

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

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

Ответ 6

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

        [[GIDSignIn sharedInstance] signIn];

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

        [[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];

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

Ответ 8

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

Ответ 9

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

После интеграции Знака Google и включения API календаря Google я смог работать с API календаря Google для извлечения и добавления событий календаря. Мы просто должны установить авторизатор для 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.

введите описание изображения здесь

Ответ 10

После того, как вход в Google завершит вход в систему, используйте currentUser, чтобы получить fetcherAuthorizer, это можно использовать как авторизатор службы Google Диска.

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

GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;

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

}

Ответ 11

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

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");

Ответ 12

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

<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />

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

Спасибо