在 Laravel 5 中使用 Guzzle 和 Socialite 向 Google API 发出请求
Making requests to Google API using Guzzle and Socialite in Laravel 5
我正在构建一个网络应用程序,它必须与 Google 联系人 API 交互并检索经过身份验证的用户的联系人列表,但我得到
ClientException in RequestException.php line 89:
Client error response [url] https://www.google.com/m8/feeds/contacts/ambermphatic@gmail.com/full?prettyPrint=false [status code] 403 [reason phrase] Forbidden
这是我的 AuthenticateUser.php,其中包含了 getContactList 函数,我正在尝试向 Google 服务器发出 Guzzle 请求,并通过将其存储在会话变量,但我仍然收到禁止响应:
<?php
namespace App;
use Laravel\Socialite\Contracts\Factory as Socialite;
use App\Repositories\UserRepository;
use Illuminate\Contracts\Auth\Guard;
class AuthenticateUser {
/**
* @var UserRepository
*/
private $users;
/**
* @var Socialite
*/
private $socialite;
/**
* @var Guard
*/
private $guard;
private $token;
public function __construct(UserRepository $users, Socialite $socialite, Guard $guard)
{
$this->users = $users;
$this->socialite = $socialite;
$this->guard = $guard;
}
/**
* @param $hasCode
* @param AuthenticateUserListener $listener
* @return mixed
*/
public function execute($hasCode, AuthenticateUserListener $listener)
{
if ( ! $hasCode ) return $this->getAuthorizationFirst();
$var = $this->getGoogleUser();
$user = $this->users->findByUsernameOrCreate($var);
\Session::put('token', $var->token );
\Auth::login($user, true);
return $listener->userHasLoggedIn($user);
}
public function logout()
{
\Auth::logout();
return redirect('/');
}
private function getAuthorizationFirst()
{
return \Socialize::with('google')->redirect();
}
private function getGoogleUser()
{
return \Socialize::with('google')->user();
}
public function getContactList()
{
$client = new \GuzzleHttp\Client();
$email = \Auth::user()->email;
$token = \Session::get('token');
$json = $client->get('https://www.google.com/m8/feeds/contacts/'. $email . '/full', [
'query' => [
'prettyPrint' => 'false',
],
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $token ,
],
]);
dd($json);
return $json;
}
}
这是我的 AuthController.php
<?php namespace App\Http\Controllers;
use App\AuthenticateUser;
use App\AuthenticateUserListener;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Two\GoogleProvider as Google;
use Illuminate\Http\Request;
class AuthController extends Controller implements AuthenticateUserListener
{
public function login(AuthenticateUser $authenticateUser, Request $request){
return $authenticateUser->execute($request->has('code'), $this);
}
public function userHasLoggedIn($user)
{
return redirect('/');
}
public function logout(AuthenticateUser $authenticateUser){
return $authenticateUser->logout();
}
public function getContactList(AuthenticateUser $authenticateUser)
{
$response = $authenticateUser->getContactList();
dd($response);
}
}
这是我的 MainController.php
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class MainController extends Controller {
public function index()
{
if (\Auth::check()) return redirect('google_welcome');
return redirect('google_login');
}
public function first()
{
return view('google_login');
}
public function back()
{
$user = \Auth::user();
return view('google_welcomeback')->with('user', $user);
}
}
我对 PHP 和 Laravel 世界还很陌生,尝试立即使用 Google API 和软件包(例如正在使用的社交名流)有什么用oAuth 2. 我真的很难充分利用我有限的知识,并没有真正在网上找到太多文档,问题是我的雇主暗示我要么必须尽快完成它,要么他会告诉我出路...
我今天遇到了同样的问题。调试 Socialite 我发现对 google.
的获取授权令牌调用存在问题
最后证明只是客户端密码被错误地复制粘贴到配置中。
要发现问题的真正根源,您可以尝试以下命令:
curl -v -d grant_type=authorization_code -d client_id="<YOUR_ID_HERE>" -d client_secret="<YOUR_SECRET_HERE>" -d code="<CODE_HERE>" -d redirect_uri="<YOUR_CALLBACK_URI_HERE>" https://accounts.google.com/o/oauth2/token
客户端 ids/secrets/uris 您已经拥有,可以使用调试器或在 ./vendor/laravel/socialite/src/Two/GoogleProvider.php 中添加一些调试打印来获取代码 - 例如在 getAccessToken($code) 方法中。
对我来说,它产生了真正的答案:
{
"error" : "invalid_client",
"error_description" : "The OAuth client was not found."
}
修复此问题后,还有一个未记录的警告 - Socialite 需要您的 Google 应用启用 Google+ API。这可以在以下位置完成:https://console.developers.google.com
我已经设法克服并最终克服了那个错误,将我的 getContactList 函数更改为以下内容并添加了适当的范围:
public function getContactList()
{
$config = [
'client_id' => env('CLIENT_ID', ''),
'client-secret' => env('CLIENT_SECRET', ''),
];
$client = new \GuzzleHttp\Client($config);
$email = \Auth::user()->email;
$token = \Session::get('token');
$json = $client->get('https://www.google.com/m8/feeds/contacts/default/full/', [
'headers' => [
'Authorization' => 'Bearer ' . $token,
],
]);
dd($json);
return $json;
我正在构建一个网络应用程序,它必须与 Google 联系人 API 交互并检索经过身份验证的用户的联系人列表,但我得到
ClientException in RequestException.php line 89:
Client error response [url] https://www.google.com/m8/feeds/contacts/ambermphatic@gmail.com/full?prettyPrint=false [status code] 403 [reason phrase] Forbidden
这是我的 AuthenticateUser.php,其中包含了 getContactList 函数,我正在尝试向 Google 服务器发出 Guzzle 请求,并通过将其存储在会话变量,但我仍然收到禁止响应:
<?php
namespace App;
use Laravel\Socialite\Contracts\Factory as Socialite;
use App\Repositories\UserRepository;
use Illuminate\Contracts\Auth\Guard;
class AuthenticateUser {
/**
* @var UserRepository
*/
private $users;
/**
* @var Socialite
*/
private $socialite;
/**
* @var Guard
*/
private $guard;
private $token;
public function __construct(UserRepository $users, Socialite $socialite, Guard $guard)
{
$this->users = $users;
$this->socialite = $socialite;
$this->guard = $guard;
}
/**
* @param $hasCode
* @param AuthenticateUserListener $listener
* @return mixed
*/
public function execute($hasCode, AuthenticateUserListener $listener)
{
if ( ! $hasCode ) return $this->getAuthorizationFirst();
$var = $this->getGoogleUser();
$user = $this->users->findByUsernameOrCreate($var);
\Session::put('token', $var->token );
\Auth::login($user, true);
return $listener->userHasLoggedIn($user);
}
public function logout()
{
\Auth::logout();
return redirect('/');
}
private function getAuthorizationFirst()
{
return \Socialize::with('google')->redirect();
}
private function getGoogleUser()
{
return \Socialize::with('google')->user();
}
public function getContactList()
{
$client = new \GuzzleHttp\Client();
$email = \Auth::user()->email;
$token = \Session::get('token');
$json = $client->get('https://www.google.com/m8/feeds/contacts/'. $email . '/full', [
'query' => [
'prettyPrint' => 'false',
],
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $token ,
],
]);
dd($json);
return $json;
}
}
这是我的 AuthController.php
<?php namespace App\Http\Controllers;
use App\AuthenticateUser;
use App\AuthenticateUserListener;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Two\GoogleProvider as Google;
use Illuminate\Http\Request;
class AuthController extends Controller implements AuthenticateUserListener
{
public function login(AuthenticateUser $authenticateUser, Request $request){
return $authenticateUser->execute($request->has('code'), $this);
}
public function userHasLoggedIn($user)
{
return redirect('/');
}
public function logout(AuthenticateUser $authenticateUser){
return $authenticateUser->logout();
}
public function getContactList(AuthenticateUser $authenticateUser)
{
$response = $authenticateUser->getContactList();
dd($response);
}
}
这是我的 MainController.php
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class MainController extends Controller {
public function index()
{
if (\Auth::check()) return redirect('google_welcome');
return redirect('google_login');
}
public function first()
{
return view('google_login');
}
public function back()
{
$user = \Auth::user();
return view('google_welcomeback')->with('user', $user);
}
}
我对 PHP 和 Laravel 世界还很陌生,尝试立即使用 Google API 和软件包(例如正在使用的社交名流)有什么用oAuth 2. 我真的很难充分利用我有限的知识,并没有真正在网上找到太多文档,问题是我的雇主暗示我要么必须尽快完成它,要么他会告诉我出路...
我今天遇到了同样的问题。调试 Socialite 我发现对 google.
的获取授权令牌调用存在问题最后证明只是客户端密码被错误地复制粘贴到配置中。
要发现问题的真正根源,您可以尝试以下命令:
curl -v -d grant_type=authorization_code -d client_id="<YOUR_ID_HERE>" -d client_secret="<YOUR_SECRET_HERE>" -d code="<CODE_HERE>" -d redirect_uri="<YOUR_CALLBACK_URI_HERE>" https://accounts.google.com/o/oauth2/token
客户端 ids/secrets/uris 您已经拥有,可以使用调试器或在 ./vendor/laravel/socialite/src/Two/GoogleProvider.php 中添加一些调试打印来获取代码 - 例如在 getAccessToken($code) 方法中。
对我来说,它产生了真正的答案:
{
"error" : "invalid_client",
"error_description" : "The OAuth client was not found."
}
修复此问题后,还有一个未记录的警告 - Socialite 需要您的 Google 应用启用 Google+ API。这可以在以下位置完成:https://console.developers.google.com
我已经设法克服并最终克服了那个错误,将我的 getContactList 函数更改为以下内容并添加了适当的范围:
public function getContactList()
{
$config = [
'client_id' => env('CLIENT_ID', ''),
'client-secret' => env('CLIENT_SECRET', ''),
];
$client = new \GuzzleHttp\Client($config);
$email = \Auth::user()->email;
$token = \Session::get('token');
$json = $client->get('https://www.google.com/m8/feeds/contacts/default/full/', [
'headers' => [
'Authorization' => 'Bearer ' . $token,
],
]);
dd($json);
return $json;