ios - 403 त्रुटि-यह एक त्रुटि है। त्रुटि: disallowed_useragent




iphone google-calendar (8)

मैं एक IOS ऐप के अंदर Google कैलेंडर API के लिए एक उपयोगकर्ता को अधिकृत करने का प्रयास कर रहा हूं। मैं उपयोगकर्ताओं को प्रमाणित करने के लिए Google की OAuth2 सुविधा का उपयोग कर रहा हूं। विवरण के साथ प्राधिकरण पृष्ठ 403 त्रुटि के साथ खुलता है:

इस उपयोगकर्ता-एजेंट को Google को OAuth प्राधिकरण अनुरोध करने की अनुमति नहीं है क्योंकि इसे एक एम्बेडेड उपयोगकर्ता-एजेंट (जिसे वेब-व्यू के रूप में भी जाना जाता है) के रूप में वर्गीकृत किया गया है। हमारी नीति के अनुसार, केवल ब्राउज़र को Google को प्राधिकरण अनुरोध करने की अनुमति है। हम ब्राउज़र में प्राधिकरण अनुरोध करने के लिए देशी ऐप्स के लिए कई पुस्तकालय और नमूने प्रदान करते हैं।

मैंने उसी प्रक्रिया का अनुसरण किया जो इस लिंक में उल्लिखित है: https://developers.google.com/google-apps/calendar/quickstart/ios

मेरे कोड को देखने के बजाय, इस लिंक को देखना बेहतर है: https://developers.google.com/google-apps/calendar/quickstart/ios क्योंकि मैं अपने आवेदन में उसी चीज़ को कॉपी-पेस्ट करता हूं।

नीचे मेरे क्लायंट हैं और keyChainItemName:

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

Google OAuth नीतियों में हालिया परिवर्तन के बाद इस समस्या के लिए एक समाधान है।

Google साइन इन करने और Google कैलेंडर API को सक्षम करने के बाद, मैं कैलेंडर ईवेंट लाने और जोड़ने के लिए Google कैलेंडर API के साथ काम करने में सक्षम था। हमें बस GTLServiceCalendar के लिए ऑथराइज़र सेट करना होगा जो Google साइन-इन के बाद प्राप्त होता है।

service.authorizer = user.authentication.fetcherAuthorizer()

यहां Google GIDSignIn का कोड स्निपेट है, इसके बाद कैलेंडर ईवेंट्स प्राप्त करना है।

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

    }

Google देव कंसोल में मेरा क्रेडेंशियल्स अनुभाग इस प्रकार दिखाई देता है।


Google ने लंबे समय तक एम्बेडेड ब्राउज़रों को oAuth प्रमाणीकरण को संभालने की अनुमति नहीं देने का फैसला किया। सबसे अच्छा तरीका iOS पर SFSafariViewController का उपयोग करना है। यहां बताया गया है कि क्लाउडरेल एसडीके का उपयोग करके इसे कैसे हल किया जा सकता है:

उद्देश्य-सी में:

@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

और स्विफ्ट:

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

इस मुद्दे को कवर करने वाला पूरा ब्लॉग पोस्ट यहाँ पाया जा सकता है: Google सेवाओं के लिए 'अस्वीकृत'


एक ही मुद्दा मिला। वेबवॉइस ऑब्जेक्ट के लिए निम्नलिखित गुण सेट करके हल किया गया:

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

आशा है कि यह मदद करेगा।


जैसा कि पिछले उत्तरों में बताया गया है, SFSafariViewController का एक तरीका है, लेकिन जो लोग अभी भी WKWebView प्राधिकरण के लिए WKWebView का उपयोग करते हैं, WKWebView लिए एक सरल समाधान है।

बस customUserAgent को list से किसी एक में बदलें या इसे कुछ मनमाने मूल्य पर सेट करें। उसके बाद disallowed_useragent त्रुटि गायब हो जाएगी:

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

UIWebView में User-Agent बदलने के लिए आप इस उत्तर की जांच कर सकते हैं।

लेकिन सावधान रहें, क्योंकि कुछ बैकएंड कोड User-Agent हेडर मूल्य पर निर्भर कर सकते हैं।


मेरे मामले में, मैं Google के साथ लॉगिन करने के लिए मूल वेब दृश्य का उपयोग कर रहा था, मुझे पता है कि आपको उपयोगकर्ता एजेंट को वेबव्यू प्रदान करना चाहिए जो मेरे लिए काम किया गया था। नीचे दिए गए कोड की कोशिश करें मुझे यकीन है कि यह काम करेगा।

कोड को आवेदन में जोड़ें ।FishishLaunchingWithOptions

उद्देश्य सी

 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];

स्विफ्ट 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)

मैं इस मुद्दे को हल कर दिया 1 साल लग गए :-) बस मजाक कर रहे हैं। config.xml में वरीयता में नीचे पंक्ति जोड़ें

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

कृपया ध्यान दें कि मैंने इस Google लॉगिन समस्या को Inapp ब्राउज़र से हल किया है।

धन्यवाद


संक्षिप्त उत्तर यह है कि Google ने OAuth प्रवाह के लिए अपने सुरक्षा प्रतिबंधों को अपडेट कर दिया है। वे OAuth प्रवाह आरंभ करने के लिए मूल वेब-दृश्यों की अनुमति नहीं देने जा रहे हैं, बल्कि लोगों को ऐसा करने के लिए OS ब्राउज़र का उपयोग करने के लिए प्रोत्साहित कर रहे हैं। आपके मामले में, आपको संभवतः नए अनुशंसित प्रवाह का पालन करने के लिए अपने कोड को अपडेट करने के लिए Google कैलेंडर एसडीके का इंतजार करना होगा। अधिक जानकारी Google ब्लॉग में उपलब्ध है

संपादित करें: मैंने एक क्रॉस प्लेटफ़ॉर्म प्लगइन बनाने की कोशिश की है जो एक Xamarin रूपों ऐप में उपयोग करने के लिए मूल Google साइन-इन SDK के चारों ओर लपेटता है। अधिक जानकारी here पाई जा सकती here






google-oauth