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";
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)
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
<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.
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-Agent
UIWebView
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.
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.
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.
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
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.
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];
}