web-dev-qa-db-ja.com

403エラー-それはエラーです。エラー:disallowed_useragent

IOSアプリ内でGoogleカレンダーAPIのユーザーを承認しようとしています。 GoogleのOAuth2機能を使用してユーザーを認証しています。承認ページが開き、説明が記載された403エラーが表示されます。

このユーザーエージェントは、GoogleにOAuth承認リクエストを行うことを許可されていません。これは、埋め込みユーザーエージェント(Webビューとも呼ばれる)として分類されているためです。 Googleのポリシーにより、ブラウザのみがGoogleに承認リクエストを行うことが許可されています。ブラウザで認証リクエストを実行するためのネイティブアプリ用のライブラリとサンプルをいくつか提供しています。

このリンクに記載されている同じ手順に従いました: https://developers.google.com/google-apps/calendar/quickstart/ios

コードを表示するよりも、次のリンクを参照することをお勧めします。 https://developers.google.com/google-apps/calendar/quickstart/ios 応用。

以下は、clientIdとkeyChainItemNameです。

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

私の場合、私はネイティブのウェブビューを使用してグーグルでログインしていましたが、私にとってうまくいったウェブビューにユーザーエージェントを提供する方法を見つけました。以下のコードを試してみて、それがうまくいくと確信しています。

application didFinishLaunchingWithOptionsにコードを追加します

客観的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)
31
Dipen Chudasama
<preference name="OverrideUserAgent" value="Mozilla/5.0 Google" />

Cordovaプロジェクトでもこの問題に直面しています。これを試すことができます:config.xmlにこれを追加してください、私のために働いた。

15
Hardeep Singh

簡単な答えは、GoogleがOAuthフローのセキュリティ制限を更新したことです。ネイティブのWebビューがOAuthフローを開始できるようにするのではなく、OSブラウザーを使用して開始するよう人々を奨励しています。あなたの場合、おそらく、GoogleカレンダーSDKがコードを更新して新しく推奨されるフローに従うまで待つ必要があります。詳細については、 Googleブログ をご覧ください。

編集:私はXamarinフォームアプリで使用するためのネイティブGoogleサインインSDKをラップするクロスプラットフォームプラグインを作成しようとしました。詳細については、こちらをご覧ください こちら

13
Rhishikeshj

前の回答で述べたように、SFSafariViewControllerを使用する方法がありますが、OAuth認証にWKWebViewを使用している場合は、簡単な回避策があります。

customUserAgentlist のいずれかに変更するか、任意の値に設定します。その後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";
}

UIWebViewUser-Agentを変更するには、 この答え を確認します。

ただし、一部のバックエンドコードはUser-Agentヘッダー値に依存する可能性があるため、注意してください。

8
Maxim Pavlov

同じ問題になりました。 解決済み次のプロパティをwebviewオブジェクトに設定することにより:

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

これが役立つことを願っています。

5

デフォルトでは、Googleアプリがない場合、Google SDKは次の方法を使用してログインを開始するときにUIWebView内でログインを開きます。

        [[GIDSignIn sharedInstance] signIn];

次のように、この前に1行追加しました。

        [[GIDSignIn sharedInstance] setAllowsSignInWithWebView:NO];

これで、GoogleはUIWebViewポップアップを使用して認証しません。代わりに、Safariブラウザで開きます。そして今、すべてが以前と同じように機能しています。

3
Ramaraj T

Googleは、埋め込みブラウザによるoAuth認証の処理を許可しないことを決定しました。最良の方法は、iOSでSFSafariViewControllerを使用することです。 CloudRail SDKを使用して解決する方法は次のとおりです。

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

とスウィフト:

// 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サービスの「disallowed_useragent」の解決

2
Tmm

Google OAuthポリシーの最近の変更後、この問題の回避策があります。

Google Signを統合し、Google Calendar APIを有効にした後、Google Calendar APIを使用してカレンダーイベントを取得および追加できました。 Googleのサインイン後に取得されるGTLServiceCalendarの承認者を設定するだけです。

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 Dev Consoleでの資格情報セクションの表示方法です。

enter image description here

2
Jen Jose

この問題をご覧ください。 代わりにGTMAppAuthを使用してください。

2
Sally

Googleサインインがログインを終了した後、currentUserを使用してfetcherAuthorizerを取得します。これはGoogle Drive Serviceの承認者のように使用できます。

その後、通常のGoogleドライブサービスを使用できます。

GIDGoogleUser *googleUser = [GIDSignIn sharedInstance].currentUser;

if(googleUser != nil){
    self.service.authorizer = googleUser.authentication.fetcherAuthorizer;
    [self listFiles];

}
1
Mauker Olimpio

これは私のために働いています

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");
0
dev_mg99

1年かかった問題を解決しました:-)冗談です。 config.xmlの設定に以下の行を追加するだけです

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

IngoogleブラウザでこのGoogleログインの問題を解決したことに注意してください。

ありがとう

0
Prosenjeet Paul