【问题标题】:Cordova Google OAuth 2.0 - error in getting tokenCordova Google OAuth 2.0 - 获取令牌时出错
【发布时间】:2015-09-21 03:49:43
【问题描述】:

我一直在努力使用 Google OAuth 2.0 身份验证获取 Google+ 的用户个人资料,我从 Cordova 的 InAppBrowser 访问。我已经能够从 InAppBrowser 获得响应代码。当我想使用响应代码获取授权令牌时会出现问题,我想使用它来访问 Google+ API。我不知道应该使用哪个 URL 来获取令牌,对于 client_secret,我使用的是 Google Developers 控制台凭据中提供的那个(Android 应用程序的密钥:API 密钥)。

代码如下:

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,"status":0,"statusText":"Error: SecurityError: DOM Exception 18"}

真的需要你的帮助。

谢谢

【问题讨论】:

  • 快速猜测,尝试卸载插件“cordova-plugin-whitelist”,然后添加“cordova-plugin-legacy-whitelist”。请注意,这不是推荐的解决方案,但如果它解决了您的问题,则意味着您必须正确配置安全设置。你测试的是什么版本的安卓?
  • 我正在使用安装了 android v4.0.2 的 cordova v5.1.1。我刚刚尝试了您的建议,将白名单插件替换为旧插件。不幸的是,结果是一样的。响应仍然失败。那么对于令牌 url,我应该使用googleapis.com/oauth2/v3/token 来访问吗?我也试过那个,但还是失败了。有没有我为请求输入错误的参数?响应错误消息也不够清楚,我无法在 Google 上搜索。还有其他建议吗?
  • 它是关于 Content-Security-Policy,就像在使用 cordova-plugin-whitelist 的 cordova v5.1.1 中,它指定:ssl.gstatic.com'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
  • 我使用 adb logcat 收到的错误消息:[INFO:CONSOLE(0)] "拒绝连接到 'accounts.google.com/o/oauth2/token',因为它违反了以下内容安全策略指令:"default-src' self' data: gap: ssl.gstatic.com 'unsafe-eval'"。请注意,'connect-src' 没有显式设置,因此 'default-src' 用作后备。
  • 认为使用 cordova-plugin-legacy-whitelist 会禁用所有 CSP 检查...看来我错了

标签: android cordova oauth google-plus inappbrowser


【解决方案1】:

嗯,解决方案在您的最新评论中。您将 default-src 定义为 self 而没有定义 connect-src,因此您的应用只允许连接到当前页面。

您可以将 * 或 accounts.google.com 定义为 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 *;">

<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;">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多