1

登录工作正常,但在著名的 3600 秒后它将过期。已阅读有关它的一些信息,您可以请求新令牌。好的,但这不是今天这个问题的主题。

会话过期或我想更改为另一个用户帐户后,我无法弄清楚如何弹出登录窗口或强制弹出登录窗口。

在 API 示例中,他们使用该immediate属性,当将其设置为 false 时,窗口将弹出但....只有一瞬间!它弹出并消失。当用户之前从未登录过或当您从浏览器中删除所有 cookie 时,这种情况永远不会发生。

我正在考虑销毁所有 cookie,但它们位于另一个域中,因此我无法使这些 cookie 无效以强制弹出登录窗口。尝试了几件事,重新创建对象,使令牌无效等,即使会话过期,它也不想再次弹出。

我能做些什么呢?这是我编写的一些代码(注意:oauth2 和所有必要的东西都已经加载)

o.cdGoogleAutorize = function( fCallback, bPopUp, bForce )
{
  var w = window,
      fc = (typeof fCallback == 'function')?fCallback:function(){},
      bp = (typeof bPopUp == 'boolean')?bPopUp:false,
      clid = w.GAPI_CLIENT_ID+'.apps.googleusercontent.com';

  try 
  {
   if( !w.gapi || !w.gapi.auth || !w.gapi.auth.authorize )
    { return false; }
  } catch(e) { return false; }

  var aScope = w.GAPI_AUTH_SCOPES.split(','),
      i = aScope.length;    

  while( i-- )
   { aScope[i]='https://www.googleapis.com/auth/'+aScope[i]; }

  aScope.push('openid');

  if( bForce )
  { gapi.auth.setToken('');
    $d('force'); gapi = o.newInstance( gapi ); 
  } // invalidate object/token etc //gapi.auth.setToken(token)

  // authorize
  gapi.auth.authorize({
    client_id:clid
    ,scope:aScope 
    //user_id: uUserId,
    ,immediate: bp?false:true
  }, 
  function(op)
  {
   if( typeof op == 'object' && op != null && op.client_id == clid )
   {
    // $d( op.scope );
    // gapi.client.load('oauth2', 'v2', function() 
    //{
     gapi.client.oauth2.userinfo.get().execute(function(resp) 
     {
       //$d( resp );
       if( !resp.code && resp.id ) 
       { fc( resp.id ); }
       else {
              //if( !bPopUp )
               { fc(false); }
            }
     });
    //});
   }
   else fc(false);
  }); 


   };
.........
.........
.........

澄清一些事情:

  • $d() 是调试窗口的快捷方式
  • ○。是封装的对象和“this”的快捷方式

登录按钮的一些代码onclick(jquery):

 $j('#login_button').bind('click', function()
 {
   o.cdGoogleAutorize( function()
   {
     // do something 
   }, true, true );
 });

任何想法如何强制登录弹出窗口?

4

2 回答 2

0

要回答您的第一个问题,您需要请求离线访问,这将为您提供刷新令牌。您可以在前 3600 秒过期后使用刷新令牌请求新的访问令牌,无需让用户再次登录。

于 2013-08-16T01:24:30.710 回答
0

知道了!

但如果有任何其他想法,请告诉我。我意识到使用此解决方案注销应用程序和其他谷歌服务的所有驱动器连接。最好在此操作之间使用警告对话框。

我已经使用了我帐户的注销按钮的代码,并在 iframe 中使用了它。加载后我再次请求登录。我将以下代码添加到函数主体的顶部:

  if( bForce )
  { 
    var $oFrame = $('<iframe class="hidden" src="https://www.google.com/accounts/Logout?service=wise&amp;continue='+
                      'https://drive.google.com/?authuser%3D0"></iframe>');
    $oFrame.bind('load', function()
    {
      // Give it a sec
          setTimeout( function() 
      { o.cdGoogleAutorize( fCallback, true ); 
        $oFrame.remove();
      }, 1000 );
    }).appendTo('body');
    return true;
  } 
于 2013-08-16T01:29:33.240 回答