2

私のアプリケーションは、Javascript のみを使用して Google とやり取りします。ユーザー プロファイルへのアクセス、電子メールへのアクセス、および連絡先管理のアクセス許可が求められます。ページをロードすると、アプリケーションは、ユーザーがそれらのアクセス許可を既に付与しているかどうかを確認し、付与されている場合はアクセス トークンを取得します。

サンプルコードは次のとおりです。

var GoogleContacts = {
...
    checkAuth: function(){
        gapi.auth.authorize({
            client_id: googleKeys.clientId, 
            scope: googleKeys.scopes, 
            immediate: true
          }, 
          jQuery.proxy(this.handleAuthResult, this)
        );
    },
    askAuth: function(){
        gapi.auth.authorize({
            client_id: googleKeys.clientId, 
            scope: googleKeys.scopes, 
            immediate: false
          }, 
          jQuery.proxy(this.handleAuthResult, this)
        );
    }
...
}

....

function handleGoogleApiLoad(){
    gapi.client.setApiKey(googleKeys.apiKey);
    gapi.auth.init(function(){console.info('popup api ready')});
    setTimeout(function(){GoogleContacts.checkAuth();}, 300);
}

....

$('#emailButton').click(function() {
    if(!accessToken)
       GoogleContacts.askAuth();
    ...
});

これで、ユーザーが初めてアクセスした場合、「メールを送信」ボタンを押したときに正しい権限が求められます。ユーザーがページをリロードすると、シームレスなアクセス許可チェックでエラーが返され、ユーザーが「メールを送信」ボタンを押すと、Google 認証ポップアップが再び開き、オフライン アクセス許可が求められるようになりました。
JS API はオフライン アクセスを実際に使用しないため、これは正しくないようです。
この問題は、Google が増分認証機能をリリースした後に始まったようです : http://googleplusplatform.blogspot.co.il/2013/12/google-sign-in-improvements11.html

ユーザーを奇妙な許可要求で混乱させないようにコードを変更しますか?

アップデート:

plus api とgapi.auth.signIn()メソッドを使用しようとしましたが、同じ結果になりました。どうやら、この問題はスコープに依存しているようです。ログイン スコープのみを使用すると、すべてが期待どおりに機能しますが、Google コンタクト アクセス スコープ https:||www.google.com/m8/feeds/ を追加すると、常にオフライン アクセスが発生します。 2 回目にページに入るときに要求します。これを確認するフィドルは次のとおりです: http://jsfiddle.net/hjLM6/6/ これはバグに違いありません。ユーザーを怖がらせるので、Google にすぐに対処してもらいたいと思います。

4

2 に答える 2

0

メソッドのimmediate:falseパラメーターがaskAuth原因です。Abraham が言及している投稿では、背景が説明されています。

このメソッドは、認可フローのプログラムによる開始を処理gapi.auth.authorize()するために使用できるようになり、動的コールバックを使用する必要があるため、通常はほとんどの場合回避する必要があります。ユーザーのセッション状態の監視に関する情報では、サインイン コールバック関数を起動する方法とタイミング、および認証結果オブジェクト内の値を使用して、ユーザーが以前にアプリを承認したか、サインインしたか (またはサインアウトしたか) を判断する方法について説明しています。 )、または Google にサインイン (またはサインアウト) します。gapi.auth.signIn()

checkAuth 関数と askAuth 関数を効果的に組み合わせて、認証結果オブジェクトのステータスをチェックし、それに応じて動作します。代わりgapi.auth.signIn()に、アプリに必要なパラメーターとスコープを使用して、メール ボタンのクリック イベントがトリガーされます。

于 2013-12-29T05:42:24.613 に答える
0

drive.readonly スコープでまったく同じ問題が発生しました。これを回避する方法の価値があるのは、常に immediate = false で authorize を呼び出すことです。すでに承認されているユーザーに対してこれを行うと、Google は一瞬だけポップアップを開きますが、すぐに閉じます (ブラウザのイベント ハンドラでポップアップを開く機会を利用しているようです)。ユーザーが承認する必要がある場合)。

不思議なことに、以前に immediate = true を使用していた localhost サーバーでは、引き続きオフライン アクセスのリクエストが表示されます。

于 2014-01-13T18:56:06.950 に答える