2015-07-03 91 views
0

我一直在挣扎了一段时间,现在使用谷歌的OAuth 2.0认证,以获取Google+的用户配置文件,我从InAppBrowser访问科尔多瓦。我已经能够从InAppBrowser获得响应代码。当我想使用响应代码获取授权令牌时发生问题,我想使用它来访问Google+ API。我不知道应该使用哪个URL来获取令牌,对于client_secret,我使用的是Google Developers控制台的凭据(Key for Android应用程序:API密钥)中提供的那个。科尔多瓦谷歌的OAuth 2.0 - 误差在获得令牌

下面是代码:

authorize: function(options) { 
    var deferred = $.Deferred(); 

    var authUrl = 'https://accounts.google.com/o/oauth2/auth?' + $.param({ 
     response_type: 'code', 
     client_id: options.client_id, 
     redirect_uri: options.redirect_uri, 
     scope: options.scope 
    }); 

    var authWindow = cordova.InAppBrowser.open(authUrl, '_blank', 'location=no,toolbar=no'); 

    $(authWindow).on('loadstart', function(e) { 
     var url = e.originalEvent.url; 
     var code = app.getParameterByName(url, 'code').trim(); 
     var error = app.getParameterByName(url, 'error'); 

     if (code || error) { 
      authWindow.close(); 

      if (code) { 
       $.post('https://accounts.google.com/o/oauth2/token', { 
        code: code, 
        client_id: options.client_id, 
        client_secret: options.client_secret, 
        redirect_uri: options.redirect_uri, 
        grant_type: 'authorization_code' 
       }).done(function(data) { 
        deferred.resolve(data); 
       }).fail(function(response) { 
        console.log(JSON.stringify(response)); 
        deferred.reject(response.responseJSON); 
       }); 
      } else if (error) { 
       deferred.reject({error: error}); 
      } 
     } 
    }); 

    return deferred.promise(); 
} 

该请求将总是被捕获为失败,与响应消息: { “readyState的”:0 “状态”:0 “状态文本”:“错误: SecurityError:DOM Exception 18“}

真的需要你的帮助。

谢谢

+0

快速猜测,尝试卸载插件 “科尔多瓦 - 插件白名单”,然后添加“cordova-plugin-legacy-whitelist”。请不要这不是推荐的解决方案,但如果它解决了您的问题,这意味着您必须正确配置安全设置。你用什么版本的Android测试? – QuickFix

+0

我使用安装了android v4.0.2的cordova v5.1.1。我刚刚尝试了您的建议,将旧白名单插件替换为白名单插件。不幸的是结果是一样的。答复仍然失败。因此,对于令牌网址,我应该使用https://www.googleapis.com/oauth2/v3/token访问吗?我也试过这个,但仍然失败。有没有我提出错误的请求的参数?响应错误消息也不够清楚,我不能在Google上搜索。任何其他建议? –

+0

它是关于内容安全策略,如cordova v5.1.1使用cordova-plugin-whitelist,它指定:

回答

0

那么,解决方案是在您的最新评论。您将default-src定义为self,并且不定义connect-src,因此您的应用只能连接到当前页面。

可以定义*或accounts.google.com作为连接-SRC:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src *;"> 

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src 'self' https://accounts.google.com;">