7

開始〜2週間前に、一部のお客様がGoogleサービスでの認証を妨げる問題が発生し始めました。これまでに遭遇したすべてのインスタンスは、Gmail以外のドメインにあるようです。この問題は、gapi.auth.authorizeからのhttps://accounts.google.com/o/oauth2/auth要求が、これらの特定のクライアントの「X-Frame-Options:SAMEORIGIN」ヘッダーを含む応答を返すように見えます(下記の相違部分を参照)。私はローカルでこの問題を再現することができませんでしたが、失敗したリクエストのHARが与えられました。Google OAuth gapi.auth.authorize X-Frame-Options:SAMEORIGIN

これと同じ認証方法は、他のホストドメイン(非@ gmailアカウント)を含むさまざまなクライアントでうまくいきます。

何が原因でこのリクエストが失敗する可能性がありますか?調査すべき事項や追加情報?

開発者コンソールhttps://www.moo.doは有効なJavascriptの起源です。

最終的にユーザーのコンソールにエラーが表示されます。 X-Frameで読み込みが拒否されました - オプション:https://accounts.google.com/o/oauth2/auth?クロスオリジンフレーミングを許可していません。

類似

  • 承認する際に、これらの要求の両方が真=即時使用。 immediate = falseを使用すると(リクエストがアカウントセレクタポップアップを通過する)、失敗アカウントはリクエストを正常に処理します)。 X枠-オプションヘッダが存在する失敗アカウントに応答して

相違

  • 失敗アカウントに対する応答では、response.content.sizeフィールドは0です。さらに、response._transferSizeは0で、response._errorフィールドが存在します(空の場合)。
  • 失敗アカウントの応答では、スコープのパラメータは '[scope] + [scope] + [scope]'としてエンコードされ、廃止されました。 [編集:まだ使用されていない、非推奨のスペースで区切られたスコープを使用する別のHARを受信しました]

以下は成功したリクエストと失敗したリクエストです。私は、失敗したリクエストが余分のヘッダーを返す理由について紛失しています。情報の一部が削除([削除])されたか、または編集されました(XXXX/YYYY)。

成功したリクエスト

{ 
    "startedDateTime": "2016-03-03T15:52:27.625Z", 
    "time": 84.7660000436008, 
    "request": { 
    "method": "GET", 
    "url": "https://accounts.google.com/o/oauth2/auth?client_id=597847337936.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.appdata%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&immediate=true&login_hint=YYYYY%40YYYY.com&authuser=-1&include_granted_scopes=true&proxy=oauth2relay593501023&redirect_uri=postmessage&origin=https%3A%2F%2Fwww.moo.do&response_type=token&state=867674703%7C0.1520984533&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.d1w1l2mcNcs.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCMuer-UxvQzEv7JYzkFSQh2Kou7xA", 
    "httpVersion": "unknown", 
    "headers": [ 
     { 
     "name": "pragma", 
     "value": "no-cache" 
     }, 
     { 
     "name": "accept-encoding", 
     "value": "gzip, deflate, sdch" 
     }, 
     { 
     "name": "accept-language", 
     "value": "en-US,en;q=0.8" 
     }, 
     { 
     "name": "upgrade-insecure-requests", 
     "value": "1" 
     }, 
     { 
     "name": "user-agent", 
     "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36" 
     }, 
     { 
     "name": "accept", 
     "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
     }, 
     { 
     "name": "cache-control", 
     "value": "no-cache" 
     }, 
     { 
     "name": ":authority", 
     "value": "accounts.google.com" 
     }, 
     { 
     "name": "cookie", 
     "value": [REMOVED] 
     }, 
     { 
     "name": ":scheme", 
     "value": "https" 
     }, 
     { 
     "name": "x-chrome-connected", 
     "value": "id=108229145437218213687,mode=0,enable_account_consistency=false" 
     }, 
     { 
     "name": "referer", 
     "value": "https://www.moo.do/app/" 
     }, 
     { 
     "name": "x-client-data", 
     "value": "CKO2yQEIwbbJAQj9lcoB" 
     }, 
     { 
     "name": ":method", 
     "value": "GET" 
     } 
    ], 
    "queryString": [ 
     { 
     "name": "client_id", 
     "value": "597847337936.apps.googleusercontent.com" 
     }, 
     { 
     "name": "scope", 
     "value": "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.appdata%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive" 
     }, 
     { 
     "name": "immediate", 
     "value": "true" 
     }, 
     { 
     "name": "login_hint", 
     "value": "YYYYY%40YYYY.com" 
     }, 
     { 
     "name": "authuser", 
     "value": "-1" 
     }, 
     { 
     "name": "include_granted_scopes", 
     "value": "true" 
     }, 
     { 
     "name": "proxy", 
     "value": "oauth2relay593501023" 
     }, 
     { 
     "name": "redirect_uri", 
     "value": "postmessage" 
     }, 
     { 
     "name": "origin", 
     "value": "https%3A%2F%2Fwww.moo.do" 
     }, 
     { 
     "name": "response_type", 
     "value": "token" 
     }, 
     { 
     "name": "state", 
     "value": "867674703%7C0.1520984533" 
     }, 
     { 
     "name": "jsh", 
     "value": "m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.d1w1l2mcMcs.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCMuer-UxvQzEv7JYzkFSQh2Kou7xA" 
     } 
    ], 
    "cookies": [ 
     { 
     "name": "LSOLH", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "SMSV", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "RMME", 
     "value": "false", 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "ACCOUNT_CHOOSER", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "GALX", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "GoogleAccountsLocale_session", 
     "value": "en", 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "expor", 
     "value": "3100077", 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "GMAIL_RTT", 
     "value": "151", 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "S", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "SID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "LSID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "HSID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "SSID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "APISID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "SAPISID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "GAPS", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "LSOLH", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "OGPC", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     }, 
     { 
     "name": "NID", 
     "value": [REMOVED], 
     "expires": null, 
     "httpOnly": false, 
     "secure": false 
     } 
    ], 
    "headersSize": -1, 
    "bodySize": 0 
    }, 
    "response": { 
    "status": 200, 
    "statusText": "OK", 
    "httpVersion": "unknown", 
    "headers": [ 
     { 
     "name": "pragma", 
     "value": "no-cache" 
     }, 
     { 
     "name": "date", 
     "value": "Thu, 03 Mar 2016 15:52:27 GMT" 
     }, 
     { 
     "name": "content-encoding", 
     "value": "gzip" 
     }, 
     { 
     "name": "x-content-type-options", 
     "value": "nosniff" 
     }, 
     { 
     "name": "server", 
     "value": "GSE" 
     }, 
     { 
     "name": "content-language", 
     "value": "en" 
     }, 
     { 
     "name": "status", 
     "value": "200" 
     }, 
     { 
     "name": "cache-control", 
     "value": "no-cache, no-store, max-age=0, must-revalidate" 
     }, 
     { 
     "name": "content-type", 
     "value": "text/html; charset=UTF-8" 
     }, 
     { 
     "name": "alt-svc", 
     "value": "quic=\":443\"; ma=2592000; v=\"30,29,28,27,26,25\"" 
     }, 
     { 
     "name": "alternate-protocol", 
     "value": "443:quic,p=1" 
     }, 
     { 
     "name": "x-xss-protection", 
     "value": "1; mode=block" 
     }, 
     { 
     "name": "expires", 
     "value": "Fri, 01 Jan 1990 00:00:00 GMT" 
     } 
    ], 
    "cookies": [], 
    "content": { 
     "size": 2096, 
     "mimeType": "text/html" 
    }, 
    "redirectURL": "", 
    "headersSize": -1, 
    "bodySize": -1, 
    "_transferSize": 1051 
    }, 
    "cache": {}, 
    "timings": { 
    "blocked": 1.07300002127886, 
    "dns": -1, 
    "connect": -1, 
    "send": 0.39199995808303, 
    "wait": 81.3200001139194, 
    "receive": 1.9809999503195002, 
    "ssl": -1 
    }, 
    "connection": "2025013", 
    "pageref": "page_1" 
} 

失敗した要求

{ 
    "startedDateTime": "2016-03-03T10:12:35.752Z", 
    "time": 442.6579999853857, 
    "request": { 
    "method": "GET", 
    "url": "https://accounts.google.com/o/oauth2/auth?client_id=597847337936.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.appdata+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&immediate=true&login_hint=XXXXX%40XXXX.com&authuser=-1&include_granted_scopes=true&proxy=oauth2relay235542267&redirect_uri=postmessage&origin=https%3A%2F%2Fwww.moo.do&response_type=token&state=638324187%7C0.1211244794&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.de.7pJmZpTVQp8.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCOmU_zLoubGrUI-_ZI9ZhB7rGP1Sw", 
    "httpVersion": "unknown", 
    "headers": [ 
     { 
     "name": "Accept", 
     "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
     }, 
     { 
     "name": "Referer", 
     "value": "https://www.moo.do/app/" 
     }, 
     { 
     "name": "Upgrade-Insecure-Requests", 
     "value": "1" 
     }, 
     { 
     "name": "User-Agent", 
     "value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36" 
     } 
    ], 
    "queryString": [ 
     { 
     "name": "client_id", 
     "value": "597847337936.apps.googleusercontent.com" 
     }, 
     { 
     "name": "scope", 
     "value": "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.install+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.appdata+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly" 
     }, 
     { 
     "name": "immediate", 
     "value": "true" 
     }, 
     { 
     "name": "login_hint", 
     "value": "XXXXX%40XXXX.com" 
     }, 
     { 
     "name": "authuser", 
     "value": "-1" 
     }, 
     { 
     "name": "include_granted_scopes", 
     "value": "true" 
     }, 
     { 
     "name": "proxy", 
     "value": "oauth2relay235542267" 
     }, 
     { 
     "name": "redirect_uri", 
     "value": "postmessage" 
     }, 
     { 
     "name": "origin", 
     "value": "https%3A%2F%2Fwww.moo.do" 
     }, 
     { 
     "name": "response_type", 
     "value": "token" 
     }, 
     { 
     "name": "state", 
     "value": "638324187%7C0.1211244794" 
     }, 
     { 
     "name": "jsh", 
     "value": "m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.de.7pJmZpTVQp8.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAGLTcCOmU_zLoubGrUI-_ZI9ZhB7rGP1Sw" 
     } 
    ], 
    "cookies": [], 
    "headersSize": -1, 
    "bodySize": 0 
    }, 
    "response": { 
    "status": 200, 
    "statusText": "OK", 
    "httpVersion": "unknown", 
    "headers": [ 
     { 
     "name": "pragma", 
     "value": "no-cache" 
     }, 
     { 
     "name": "date", 
     "value": "Thu, 03 Mar 2016 10:12:35 GMT" 
     }, 
     { 
     "name": "content-encoding", 
     "value": "gzip" 
     }, 
     { 
     "name": "x-content-type-options", 
     "value": "nosniff" 
     }, 
     { 
     "name": "server", 
     "value": "GSE" 
     }, 
     { 
     "name": "x-frame-options", 
     "value": "SAMEORIGIN" 
     }, 
     { 
     "name": "content-language", 
     "value": "de" 
     }, 
     { 
     "name": "status", 
     "value": "200" 
     }, 
     { 
     "name": "cache-control", 
     "value": "no-cache, no-store, max-age=0, must-revalidate" 
     }, 
     { 
     "name": "content-type", 
     "value": "text/html; charset=UTF-8" 
     }, 
     { 
     "name": "alt-svc", 
     "value": "quic=\":443\"; ma=2592000; v=\"30,29,28,27,26,25\"" 
     }, 
     { 
     "name": "alternate-protocol", 
     "value": "443:quic,p=1" 
     }, 
     { 
     "name": "x-xss-protection", 
     "value": "1; mode=block" 
     }, 
     { 
     "name": "expires", 
     "value": "Fri, 01 Jan 1990 00:00:00 GMT" 
     } 
    ], 
    "cookies": [], 
    "content": { 
     "size": 0, 
     "mimeType": "text/html" 
    }, 
    "redirectURL": "", 
    "headersSize": -1, 
    "bodySize": -1, 
    "_transferSize": 0, 
    "_error": "" 
    }, 
    "cache": {}, 
    "timings": { 
    "blocked": 0.944999977946281, 
    "dns": -1, 
    "connect": -1, 
    "send": 0.3190000134054589, 
    "wait": 151.53400000417625, 
    "receive": 289.85999998985767, 
    "ssl": -1 
    }, 
    "pageref": "page_1" 
} 

答えて

2

グレート。アプリは7つの以上のOAuthスコープを要求した場合(Google Appsの)ホストのドメインアカウントにヘッダ:

問題/原因

は、Googleの認可サーバは、「SAMEORIGIN X-フレーム・オプション」を添付します。7未満(スコープが何であるかは関係ありません)、同一アカウント上の同じ要求には、戻り呼び出しで指定されたX-Frame-Optionsヘッダーがありません。

このREPROを実現するために必要な追加の可動部品(GAPI JSクライアントからJSHのPARAMを供給しなければならない)とX-フレーム・オプションヘッダが返され、他のシナリオがあります。この時点で、再認証ファイルには、Google認証サーバーに問題があるように見えます。 X-フレーム-オプションヘッダの性質のために:)

を不満

は、クライアント側のエラー検出手段は、問題の一層この特定のエラーを犯した要求がブロックされていることを知ることができません。さらに、承認コールバックは、何らかの種類の通知があるのを待っている要求のアプリをlimboの状態にしておく何らかの失敗があったことを通知することはありません。

問題のデモンストレーション

Demos

2つのREPROファイルがあります含ま:

auth_repro.htmlを - これは完全にGAPI JSクライアントを回避し、問題を示しています。クライアントが問題を解決するために許可要求に添付する特定のパラメータ(jsh)を使用します。

auth_repro_gapi.html - これはGAPI JSクライアントを使用して問題を再現します。

ソリューション

は、あなたが要求しているか、あなたの承認要求が失敗黙っ開始します/管理スコープをトリミングについての怠惰はいけません。

この動作が問題でなかった場合、これは素晴らしいことです。最高の推測は、セキュリティ対策が間違っているということですか?