Erreur 403 - c'est une erreur. Erreur: rejeté useragent

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

ce user-agent n'est pas autorisé à faire une demande D'autorisation D'Utilisation auprès de Google car il est classé comme un user-agent intégré (également connu sous le nom de web-view). Conformément à notre Politique, seuls les navigateurs sont autorisés à adresser des demandes d'autorisation à Google. Nous offrons plusieurs bibliothèques et échantillons pour applications natives pour effectuer la demande d'autorisation dans le navigateur.

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

au lieu de voir mon code, il vaut mieux regarder ce lien:https://developers.google.com/google-apps/calendar/quickstart/ios parce que j'ai copié la même chose dans ma demande.

ci-dessous sont mes clientId et keyChainItemName:

static NSString *const kKeychainItemName = @"Google Calendar API";
static NSString *const kClientID = @"954370342601-sgl8k0jrbqdeagea9v6vfu3tspte96ci.apps.googleusercontent.com";
33
demandé sur TylerH 2016-11-14 17:29:43

10 réponses

dans mon cas, j'utilisais native web view pour me connecter avec google, je découvre la façon dont vous devriez fournir agent utilisateur à webview, il a été travaillé pour moi. Essayez le code ci-dessous, je suis sûr que ça va marcher.

Ajouter le code dans application did finishlaunchingwithoptions

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)
22
répondu Dipen Chudasama 2018-08-21 05:06:44

la réponse courte est que Google a mis à jour ses restrictions de sécurité pour OAuth flow. Ils ne vont pas permettre aux web-views natives d'initier des flux de saturation, mais plutôt encourager les gens à utiliser les navigateurs OS pour le faire. Dans votre cas, vous devrez probablement attendre que le SDK Google calendar mette à jour son code pour respecter le flux nouvellement recommandé. Plus d'informations sont disponibles dans le le blog de Google

EDIT: j'ai essayé de créer un plugin multi-plateforme qui s'enroule autour des natifs Google sign-in SDK pour l'utilisation dans un Xamarin formulaires app. Plus d'informations peuvent être trouvées ici

13
répondu Rhishikeshj 2016-12-24 09:14:04
<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />

je fais aussi face à cette question sur mon projet cordova. Vous pouvez essayer cette: Il suffit d'ajouter ceci à votre configuration.xml, a travaillé pour moi.

11
répondu Hardeep Singh 2017-07-24 23:43:57

tel que mentionné dans les réponses précédentes, SFSafariViewController est un chemin à parcourir, mais pour ceux qui utilise encore WKWebView pour l'autorisation D'une autre personne, il y a une solution simple.

il suffit de changer customUserAgent à un liste ou définissez une valeur arbitraire. Après que disallowed_useragent erreur disparaît:

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-AgentUIWebView vous pouvez vérifier l' cette réponse.

mais attention, car certains codes d'arrière-plan peuvent dépendre User-Agent valeur de l'en-tête.

7
répondu Maxim Pavlov 2017-05-23 10:31:36

Suis même question. Résolu en définissant la propriété suivante à l'objet webview:

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

J'espère que cela aidera.

4
répondu Kundan Singh Thakur 2017-12-29 15:18:50

par défaut, si vous n'avez pas d'application google, le SDK google ouvre la connexion à l'intérieur d'un UIWebView quand nous lancer la connexion en utilisant la méthode suivante.

        [[GIDSignIn sharedInstance] signIn];

je viens d'ajouter une ligne avant celle-ci, qui est la suivante.

        [[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];

maintenant google n'autorise pas l'utilisation de UIWebView popup. Au lieu de cela, il s'ouvre dans le navigateur Safari. Et maintenant, tout fonctionne, tout simplement que la façon dont elle était.

3
répondu Ramaraj T 2017-01-11 17:12:45

regardez ce problème. utilisez GTMAppAuth à la place.

2
répondu Sally 2016-12-28 02:52:21

Google a décidé de ne plus permettre aux navigateurs intégrés de gérer l'authentification oAuth. La meilleure façon est D'utiliser SFSafariViewController sur iOS. Voici comment il peut être résolu en utilisant le SDK CloudRail:

Dans L'Objectif-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 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
}
résoudre 'disallowed_useragent' pour les services Google

2
répondu Tmm 2017-01-27 10:54:14

il y a une solution à ce problème après le récent changement dans les politiques de Google outh.

après l'intégration de Google Sign et l'activation de L'API Google Calendar, j'ai pu travailler avec L'API Google Calendar pour récupérer et ajouter des événements Calendar. Nous avons juste à définir l'authorizer pour GTLServiceCalendar qui est obtenu après Google Se connecter.

service.authorizer = user.authentication.fetcherAuthorizer()

Voici les extraits de code de Google GIDSignIn, suivi par fetching calendar événement.

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 ma section des justificatifs d'identité apparaît dans la Console de Google Dev.

enter image description here

2
répondu Jen Jose 2017-02-04 20:45:55

après l'ouverture de session google, utilisez le currentUser pour obtenir l' fetcherAuthorizer, ceci peut être utilisé comme un authorizer pour le Google Drive Service.

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

GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;

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

}
1
répondu Mauker Olimpio 2017-03-15 20:54:06