Google oAuth:redirect_uri_mismatch [英] Google oAuth: redirect_uri_mismatch

查看:49
本文介绍了Google oAuth:redirect_uri_mismatch的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试从Google获取oAuth令牌时,我们收到"redirect_uri_mismatch"错误:

We are getting a "redirect_uri_mismatch" error when attempting to get an oAuth token from Google:

[client 127.0.0.1:49892] {\n  "error" : "redirect_uri_mismatch"\n}, referer: `http://localhost/oAuth/chess-login.html`

正在使用两个文件:chess-login.html和plus.php(下面的代码).

There are two files being used: chess-login.html, and plus.php (code below).

Google API具有以下URI:

The Google API has the following URI:

http://localhost/oAuth/chess-login.html

任何人都可以指出解决方案吗?

Can anyone point to a solution?

plus.php:

<?php

    $client_id = "XXX.apps.googleusercontent.com"; //your client id
    $client_secret = "XXX"; //your client secret
    $redirect_uri = "http://localhost/chess-login.html";
    $scope = "https://www.googleapis.com/auth/plus.login"; //google scope to access
    $state = "profile"; //optional
    $access_type = "offline"; //optional - allows for retrieval of refresh_token for offline access

    if(isset($_POST['results'])){
        $_SESSION['accessToken'] = get_oauth2_token($_POST['results']);
    }

    //returns session token for calls to API using oauth 2.0
    function get_oauth2_token($code) {
        global $client_id;
        global $client_secret;
        global $redirect_uri;

        $oauth2token_url = "https://accounts.google.com/o/oauth2/token";
        $clienttoken_post = array(
        "code" => $code,
        "client_id" => $client_id,
        "client_secret" => $client_secret,
        "redirect_uri" => $redirect_uri,
        "grant_type" => "authorization_code"
        );

        $curl = curl_init($oauth2token_url);


        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post);
        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        $json_response = curl_exec($curl);
        error_log($json_response);
        curl_close($curl);   
        $authObj = json_decode($json_response);

        if (isset($authObj->refresh_token)){
            //refresh token only granted on first authorization for offline access
            //save to db for future use (db saving not included in example)
            global $refreshToken;
            $refreshToken = $authObj->refresh_token;
        }

        $accessToken = $authObj->access_token;
        return $accessToken;
    }
?>

chess-login.html:

<!DOCTYPE html>
<html>

<html itemscope itemtype="http://schema.org/Article">
<head>
  <!-- BEGIN Pre-requisites -->
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>  
  <script type="text/javascript">
    (function () {
      var po = document.createElement('script');
      po.type = 'text/javascript';
      po.async = true;
      po.src = 'https://plus.google.com/js/client:plusone.js?onload=start';
      var s = document.getElementsByTagName('script')[0];
      s.parentNode.insertBefore(po, s);
    })();
  </script>
  <!-- END Pre-requisites -->
</head>


<body>

<div id="signinButton">
  <span class="g-signin"
    data-scope="https://www.googleapis.com/auth/plus.login"
    data-clientid="XXX.apps.googleusercontent.com"
    data-redirecturi="postmessage"
    data-accesstype="offline"
    data-cookiepolicy="single_host_origin"
    data-callback="signInCallback">
  </span>
</div>
<div id="result"></div>

<p id="onSignInText"></p>

</body>

<!-- Last part of BODY element in file index.html -->
<script type="text/javascript">
function signInCallback(authResult) {

  if (authResult['code']) {

    // Hide the sign-in button now that the user is authorized, for example:
    $('#signinButton').attr('style', 'display: none');
    //document.getElementById("onSignInText").innerHTML = "Sign in successful";

    $.post("plus.php", {results: authResult['code']},
        function(data){alert(data); });


    // Send the code to the server
    $.ajax({
      type: 'POST',
      url: 'plus.php?storeToken',
      contentType: 'application/octet-stream; charset=utf-8',
      success: function(result) {
        // Handle or verify the server response if necessary.

        // Prints the list of people that the user has allowed the app to know
        // to the console.
        console.log(result);
        if (result['profile'] && result['people']){
          $('#results').html('Hello ' + result['profile']['displayName'] + '. You successfully made a server side call to people.get and people.list');
        } else {
          $('#results').html('Failed to make a server-side call. Check your configuration and console.');
        }
      },
      processData: false,
      data: authResult['code']
    });



  } else if (authResult['error']) {
    // There was an error.
    // Possible error codes:
    //   "access_denied" - User denied access to your app
    //   "immediate_failed" - Could not automatially log in the user
    // console.log('There was an error: ' + authResult['error']);
  }
}
</script>


</html>

推荐答案

您应在服务器中设置redirect_uri以匹配客户端中具有的data-redirecturi="postmessage"(您的流程不需要 redirect ,因此不会使用Google API控制台中的值...)

You should set the redirect_uri in the server to match the data-redirecturi="postmessage" that you have in the client (your flow does not require a redirect, so the values from Google's API console won't be used...)

. . .
$clienttoken_post = array(
  "code" => $code,
  "client_id" => $client_id,
  "client_secret" => $client_secret,
  "redirect_uri" => "postmessage",  // <== Change here!
  "grant_type" => "authorization_code"
);
. . .

这篇关于Google oAuth:redirect_uri_mismatch的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆