ios - español - error disallowed_useragent android
403 Error: eso es un error. Error: disallowed_useragent (11)
Como se mencionó en las respuestas anteriores,
SFSafariViewController
es un camino a seguir, pero para aquellos que todavía usan
WKWebView
para la autorización de OAuth, existe una solución simple.
Simplemente cambie
customUserAgent
a uno de la
list
o
customUserAgent
en algún valor arbitrario.
Después de ese error
disallowed_useragent
desaparecerá:
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";
}
Para cambiar
User-Agent
en
UIWebView
, puede verificar
esta respuesta
.
Pero tenga cuidado, ya que algunos códigos de fondo pueden depender del valor del encabezado
User-Agent
.
Estoy intentando autorizar a un usuario para la API de calendario de Google dentro de una aplicación IOS. Estoy usando la función OAuth2 de Google para autenticar a los usuarios. La página de autorización se abre con un error 403 con la descripción:
Este agente de usuario no tiene permitido hacer una solicitud de autorización de OAuth a Google, ya que está clasificado como un agente de usuario incorporado (también conocido como vista web). Según nuestra política, solo los navegadores pueden realizar solicitudes de autorización a Google. Ofrecemos varias bibliotecas y muestras para aplicaciones nativas para realizar solicitudes de autorización en el navegador.
Seguí el mismo procedimiento que se menciona en este enlace: https://developers.google.com/google-apps/calendar/quickstart/ios
En lugar de ver mi código, es mejor mirar este enlace: https://developers.google.com/google-apps/calendar/quickstart/ios porque copié y pegué lo mismo en mi aplicación.
a continuación están mi clientId y keyChainItemName:
static NSString *const kKeychainItemName = @"Google Calendar API";
static NSString *const kClientID = @"954370342601-sgl8k0jrbqdeagea9v6vfu3tspte96ci.apps.googleusercontent.com";
De forma predeterminada, si no tiene ninguna aplicación de Google, el SDK de Google abre el inicio de sesión dentro de
UIWebView
cuando iniciamos el inicio de sesión utilizando el siguiente método.
[[GIDSignIn sharedInstance] signIn];
Acabo de agregar una línea antes de esto, que es la siguiente.
[[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];
Ahora Google no autoriza el uso de la
UIWebView
emergente
UIWebView
.
En cambio, se abre en el navegador Safari.
Y ahora todo funciona como estaba.
Después de que el inicio de sesión de Google finalice el inicio de sesión, use el
currentUser
para obtener el
fetcherAuthorizer
, esto se puede usar como un autorizador para el servicio
Google Drive
.
Después de eso, puede usar el servicio Google Drive normalmente:
GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;
if(googleUser != nil){
self.service.authorizer = googleUser.authentication.fetcherAuthorizer;
[self listFiles];
}
Echa un vistazo a este problema. Use GTMAppAuth en su lugar.
En mi caso, estaba usando la vista web nativa para iniciar sesión con google, descubrí la forma en que debe proporcionar el agente de usuario para la vista web que funcionó para mí. Intente debajo del código, estoy seguro de que funcionará.
Agregue el código en la aplicación didFinishLaunchingWithOptions
C objetivo
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)
Existe una solución para este problema después del cambio reciente en las políticas de Google OAuth.
Después de integrar el signo de Google y habilitar la API de Google Calendar, pude trabajar con la API de Google Calendar para buscar y agregar eventos de calendario. Solo tenemos que configurar el autorizador para GTLServiceCalendar que se obtiene después del inicio de sesión de Google.
service.authorizer = user.authentication.fetcherAuthorizer()
Aquí están los fragmentos de código de Google GIDSignIn, seguidos de buscar eventos de calendario.
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.")
}
}
}
Así es como aparece la sección de mis credenciales en Google Dev Console.
Google decidió no permitir que los navegadores integrados manejen la autenticación oAuth. La mejor manera es usar SFSafariViewController en iOS. Aquí se explica cómo se puede resolver con el SDK de CloudRail:
En el objetivo-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
y 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
}
La publicación completa del blog que cubre este problema se puede encontrar aquí: Solución de ''disallowed_useragent'' para los servicios de Google
La respuesta breve es que Google ha actualizado sus restricciones de seguridad para el flujo de OAuth. No van a permitir que las vistas web nativas inicien flujos OAuth, sino que alientan a las personas a usar los navegadores del sistema operativo para hacerlo. En su caso, probablemente tendrá que esperar a que el SDK del calendario de Google actualice su código para obedecer el flujo recientemente recomendado. Más información está disponible en el blog de Google
EDITAR: He intentado crear un complemento multiplataforma que envuelve los SDK de inicio de sesión nativos de Google para usar en una aplicación de formularios Xamarin. Más información se puede encontrar here
Resolví el problema que tomó 1 año :-) es broma. simplemente agregue la siguiente línea de preferencia en config.xml
<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />
Tenga en cuenta que resolví este problema de inicio de sesión de Google con el navegador Inapp.
Gracias
Tengo el mismo problema. Se resuelve configurando la siguiente propiedad para el objeto webview:
webview.getSettings().setUserAgentString("Chrome/56.0.0.0 Mobile");
Espero que esto ayude.
<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />
También enfrento este problema en mi proyecto de Córdoba. Puedes probar esto: solo agrega esto a tu config.xml, funcionó para mí.