403 Error: disallowed_useragent

2019-01-15 11:27发布

问题:

I am new to mobile application development, I am developing an ios app. In which I am using google drive to get document files into my app from google account.I did that task and worked fine.But now it is not working now when I try to authenticate it shows 403 Error: disallowed_useragent in my app . I googled regarding that but somethig confusing, I read this stack overflow question from that I found google drive has updated,now I donnot know whether I want redo my task or have to update task for signin only to complete it, kindly any one suggest me regarding that

Thanks in advence

回答1:

After Following Google drive API Quick start, Add these 3 lines of code in AppDelegate.m didFinishLaunchingWithOptions as Shown below.. then it works fine ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

     NSString *userAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602";

     // set default user agent

     NSDictionary *dictionary = [[NSDictionary alloc]initWithObjectsAndKeys:userAgent,@"UserAgent", nil];
     [[NSUserDefaults standardUserDefaults] registerDefaults:(dictionary)];

    return YES;
}


回答2:

There is a workaround for this issue after the recent change in Google OAuth policies.

After integrating the Google Sign and enabling Google Drive API, I was able to work with Google Drive API to fetch all drive data. We just have to set the authorizer for GTLServiceDrive which is obtained after Google sign-in.

service.authorizer = user.authentication.fetcherAuthorizer()

Here is the code snippets of Google GIDSignIn, followed by fetching calendar events.

  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 = [kGTLAuthScopeDriveMetadataReadonly]
      private let service = GTLServiceDrive()

      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()
               loadDriveFiles()
          }
      }

     // Construct a query and get a list of upcoming events from the user calendar
       func loadDriveFiles() {
            //Googly Drive fetch Query
       }

   }


回答3:

Google is changing its Oauth policies, with this it is intended that no native web views initiate Oauth flows, I am working with an iOS app too and having the same problem, you should probably wait for them to update the SDKs and documentation or find an alternate way of authenticating to use the users information.



回答4:

An alternative way is to use the 3rd party CloudRail SDK which can use an external browser for the authentication. This blog post covers exactly the issue you've mentioned.