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";
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)
<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.
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
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
.
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.
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.
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
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.
Regardez ce problème. Utilisez plutôt GTMAppAuth.
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];
}
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");
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