web-dev-qa-db-fra.com

Erreur 403 - C'est une erreur. Erreur: disallowed_useragent

J'essaie d'autoriser un utilisateur pour l'API de calendrier Google dans une application IOS. J'utilise la fonctionnalité OAuth2 de Google pour authentifier les utilisateurs. La page d'autorisation s'ouvre avec une erreur 403 avec la description:

Cet agent d'utilisateur n'est pas autorisé à adresser une demande d'autorisation OAuth à Google car il s'agit d'un agent d'utilisateur intégré (également appelé vue Web). Selon notre politique, seuls les navigateurs sont autorisés à envoyer des demandes d'autorisation à Google. Nous proposons plusieurs bibliothèques et exemples pour que les applications natives puissent effectuer une demande d'autorisation dans un navigateur.

J'ai suivi la même procédure qui est mentionnée dans ce lien: https://developers.google.com/google-apps/calendar/quickstart/ios

Plutôt que de voir mon code, il vaut mieux consulter ce lien: https://developers.google.com/google-apps/calendar/quickstart/ios car j'ai copié-collé la même chose dans ma application.

ci-dessous sont mon clientId et keyChainItemName:

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

Dans mon cas, j'utilisais l'affichage Web natif pour me connecter à Google. Je découvre comment vous devez fournir à l'agent utilisateur l'affichage Web qui a fonctionné pour moi. Essayez ci-dessous le code, je suis sûr que cela fonctionnera.

Ajoutez le code dans application didFinishLaunchingWithOptions

Objectif 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)
31
Dipen Chudasama
<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />

Je suis également confronté à ce problème sur mon projet Cordova. Vous pouvez essayer ceci: Ajoutez simplement ceci à votre config.xml, a travaillé pour moi.

15
Hardeep Singh

La réponse courte est que Google a mis à jour ses restrictions de sécurité pour le flux OAuth. Ils ne vont pas autoriser les vues Web natives à créer OAuth, mais plutôt encourager les utilisateurs à utiliser les navigateurs du système d'exploitation. Dans votre cas, vous devrez probablement attendre que le SDK de Google Agenda mette à jour son code afin de respecter le flux nouvellement recommandé. Plus d'informations sont disponibles dans le blog Google

EDIT: j'ai essayé de créer un plugin multiplateforme qui intègre le SDK de connexion Google natif à utiliser dans une application de formulaire Xamarin. Plus d'informations peuvent être trouvées ici

13
Rhishikeshj

Comme mentionné dans les réponses précédentes, SFSafariViewController est une solution, mais pour ceux qui utilisent toujours WKWebView pour OAuth, il existe une solution de contournement simple.

Il suffit de changer customUserAgent pour l’un ou l’autre de liste ou le définir sur une valeur arbitraire. Après cette erreur disallowed_useragent disparaîtra:

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

Pour changer User-Agent dans UIWebView, vous pouvez vérifier cette réponse .

Mais soyez prudent, car certains codes dorsaux peuvent dépendre de la valeur de l'en-tête User-Agent.

8
Maxim Pavlov

J'ai le même problème. Résol en définissant la propriété suivante sur l'objet webview:

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

J'espère que cela aidera.

5
Kundan Singh Thakur

Par défaut, si vous ne possédez aucune application Google, le SDK Google ouvre la connexion à l'intérieur d'un UIWebView lorsque nous l'initialisons à l'aide de la méthode suivante.

        [[GIDSignIn sharedInstance] signIn];

Je viens d'ajouter une ligne avant cela, qui est comme suit.

        [[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];

Maintenant, Google n'autorise pas l'utilisation de la fenêtre contextuelle UIWebView. Au lieu de cela, il s'ouvre dans le navigateur Safari. Et maintenant, tout fonctionne comme avant.

3
Ramaraj T

Google a décidé de ne plus permettre aux navigateurs intégrés de gérer l'authentification oAuth. Le meilleur moyen consiste à utiliser SFSafariViewController sur iOS. Voici comment le résoudre avec le kit de développement CloudRail:

En 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

et rapide:

// 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
}

Le billet de blog complet couvrant ce problème peut être trouvé ici: Résolution de "disallowed_useragent" pour les services Google

2
Tmm

Il existe une solution de contournement à ce problème après la récente modification des règles de Google OAuth.

Après l'intégration de Google Sign et l'activation de l'API Google Agenda, j'ai pu travailler avec l'API Google Agenda pour extraire et ajouter des événements de l'agenda. Il suffit de définir l'autorisation pour GTLServiceCalendar obtenue après la connexion à Google.

service.authorizer = user.authentication.fetcherAuthorizer()

Voici les extraits de code de Google GIDSignIn, suivis de la récupération des événements du calendrier.

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.")
        }
    }

    }

Voici comment mes informations d'identification apparaissent dans la console de développement Google.

enter image description here

2
Jen Jose

Regardez ce problème. Utilisez plutôt GTMAppAuth.

2
Sally

Une fois que la connexion à Google est terminée, utilisez currentUser pour obtenir le fetcherAuthorizer, qui peut être utilisé comme autorisateur pour Google Drive Service.

Après cela, vous pouvez utiliser le service Google Drive normalement:

GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;

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

}
1
Mauker Olimpio

Cela fonctionne pour moi

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
dev_mg99

J'ai résolu le problème, il a fallu 1 an :-) je plaisante. ajoutez simplement la ligne ci-dessous de préférence dans config.xml

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

Veuillez noter que j'ai résolu ce problème de connexion à Google avec le navigateur Inapp.

Merci

0
Prosenjeet Paul