服务器端应用程序的 Google+ 登录身份验证不起作用

Posted

技术标签:

【中文标题】服务器端应用程序的 Google+ 登录身份验证不起作用【英文标题】:Google+ Sign-In for server-side apps auth not working 【发布时间】:2013-03-17 21:27:33 【问题描述】:

我尝试为 wordpress 网站添加 Google+ 身份验证。 我想要什么:如果用户未在网站上注册,则在 Google+ 中进行身份验证后 - 我将他重定向到他输入用户名的页面;如果用户已经注册 - 它将被登录。 这是我的js代码:

function doGooglePlusLogin(authResult) 
    if (authResult['code']) 
        jQuery('#signinButton').attr('style', 'display: none');
        jQuery.ajax(
            url: '<?php echo site_url(); ?>/wp-admin/admin-ajax.php',
            type: 'get',
            dataType: 'json',
            data: 
                action: 'login_gplus',
                code: authResult['code']
            ,
            success: function(result) 
            ,
        );
     else if (authResult['error']) 
    

这里是我的 php 代码:

function login_gplus() 
$response = array();

if (isset($_GET['code']) && !empty($_GET['code'])) 
    @session_start();
    $client = new Google_Client();
    $client->setApplicationName('Test');
    $client->setAccessType('offline');
    $client->setClientId(get_option(SOCIAL_GPLUS_CLIENT_ID));
    $client->setClientSecret(get_option(SOCIAL_GPLUS_CLIENT_SECRET));
    $client->setDeveloperKey(get_option(SOCIAL_GPLUS_API_KEY));
    $client->setRedirectUri(get_option(SOCIAL_GPLUS_REDIRECT_URIS));
    $client->setApprovalPrompt('auto');

    $code = $_GET['code'];
    $client->authenticate($code);

    $token = json_decode($client->getAccessToken());
    $reqUrl = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' . $token->access_token;
    $req = new Google_HttpRequest($reqUrl);

    $tokenInfo = json_decode(
            $client->getIo()
                    ->authenticatedRequest($req)
                    ->getResponseBody());

    if ($tokenInfo->error) 
        $response['test'] = $tokenInfo->error;
        send_json_response($response);
        die();
    
    if ($tokenInfo->audience != get_option(SOCIAL_GPLUS_CLIENT_ID)) 
        $response['test'] = "Token's client ID does not match app's.";
        send_json_response($response);
        die();
    
    $response['test'] = 'Succesfully connected with token: ' . print_r($token, true);

send_json_response($response);
die();

用户在 Google+ 中成功授权,但在 php 中我得到了这个:

致命错误:/var/www/html/v4/wp-content/plugins/social/google-plus/google- 中的消息“获取 OAuth2 访问令牌时出错,消息:'redirect_uri_mismatch'”未捕获异常“Google_AuthException” api/auth/Google_OAuth2.php:113堆栈跟踪:#0 /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/Google_Client.php(131): Google_OAuth2->authenticate(数组,'4/ScmpTqEIWt0SJ...')#1 /var/www/html/v4/wp-content/plugins/social/google-plus/functions.php(35): Google_Client->authenticate('4/ScmpTqEIWt0SJ ...')#2 [内部函数]: login_gplus('')#3 /var/www/html/v4/wp-includes/plugin.php(406): call_user_func_array('login_gplus', Array)#4 / var/www/html/v4/wp-admin/admin-ajax.php(74): do_action('wp_ajax_nopriv_...')#5 main 在 /var/www/html/v4/wp-content/ 中抛出plugins/social/google-plus/google-api/auth/Google_OAuth2.php 在第 113 行

在应用程序设置中指定为 http://example.com/wp-admin/admin-ajax.php 的重定向 URI。 我做错了什么?

编辑

Google+ 登录按钮定义:

<span id="signinButton">
  <span class="g-signin"
   data-callback="doGooglePlusLogin"
   data-clientid="<?php echo $this->gplus_client_id; ?>"
   data-cookiepolicy="single_host_origin" data-accesstype="offline"
   data-requestvisibleactions="http://schemas.google.com/AddActivity"
   data-scope="https://www.googleapis.com/auth/plus.login">
  </span>
</span>

SOCIAL_GPLUS_REDIRECT_URIS 是 example.com/wp-admin/admin-ajax.php?action=login_gplus

【问题讨论】:

您是使用Google+ Sign-In button 还是您自己触发流程?请发布您的前端代码,以显示此流程是如何被触发的。我们需要查看传递给 Google 的配置参数。 (隐藏您的客户端 ID。此外,我们需要在您的 PHP 方面查看您的 SOCIAL_GPLUS_REDIRECT_URIS 存在哪些值 我正在使用 Google+ 登录按钮。 &lt;span id="signinButton"&gt; &lt;span class="g-signin" data-callback="doGooglePlusLogin" data-clientid="&lt;?php echo $this-&gt;gplus_client_id; ?&gt;" data-cookiepolicy="single_host_origin" data-accesstype="offline" data-requestvisibleactions="http://schemas.google.com/AddActivity" data-scope="https://www.googleapis.com/auth/plus.login"&gt; &lt;/span&gt; &lt;/span&gt; SOCIAL_GPLUS_REDIRECT_URIS 是example.com/wp-admin/admin-ajax.php?action=login_gplus 【参考方案1】:

您的代码基本上是正确的,但是有一个小问题,我可以看到没有很好地记录!您必须将 redirectURI 设置为 postmessage 而不是您使用的 URL。

$client->setRedirectUri('postmessage');

这样它与按钮的 javascript 交换期间为令牌设置的 URI 匹配。查看示例代码:https://github.com/googleplus/gplus-quickstart-php/blob/master/signin.php 以查看它的实际效果。我会确保我们在文档中添加注释。

【讨论】:

感谢您的帮助。你救了我。 天啊!!!!我花了 8 个小时研究代码并试图摆脱这个愚蠢的redirect_uri_mismatch 错误!尝试使用编码,不使用 http/https,注册新应用程序,不同的子域.....哦,天哪,我刚刚把 postmessage 代替了。谷歌伙计们,请记录下来!!!!!! 谢谢你,你也救了我! Google 文档中没有任何内容。 :( 太棒了!!我已经挖掘这个错误好几个小时了。 请更新此页面上的文档 (developers.google.com/+/web/signin/server-side-flow) 以说明如何正确验证 Google_Client() 类。事实上,它是神秘的、误导的和令人沮丧的。

以上是关于服务器端应用程序的 Google+ 登录身份验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 扩展程序中使用 Google 帐户进行服务器端身份验证

java 示例登录Android上的Google登录活动,该活动检索用于服务器端身份验证的授权代码。见htt

如何使用 Node 服务器验证 Android Google 登录

Unity Google Play 游戏插件 - 登录/身份验证不起作用

在不打开新窗口/标签的情况下使用 Google 身份验证登录

跨平台 Google OAuth 登录:redirect_uri 不匹配