2015-03-30 2 views
3

Я строю веб-приложение, которое должно взаимодействовать с Google Contacts API и получить список контактов аутентифицированного пользователя, но я получаюзапросы Making в Google API, используя жрать и Socialite в Laravel 5

ClientException in RequestException.php line 89: 
Client error response [url] https://www.google.com/m8/feeds/contacts/[email protected]/full?prettyPrint=false [status code] 403 [reason phrase] Forbidden 

Вот мой AuthenticateUser.php, где я включил функцию getContactList, я пытаюсь сделать запрос Guzzle на Google Server и смог отправить правильный токен доступа, сохранив его в переменной сеанса, но я все еще получаю запрещенный ответ:

<?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 вселенной, что с попытками немедленно использовать API Google, и пакеты, такие как светская, который с помощью oAuth 2. Я действительно изо всех сил старался максимально использовать свои ограниченные знания и на самом деле не нашел много документации в Интернете, и проблема заключается в том, что мой работодатель намекнул, что мне нужно либо выполнить это как можно быстрее, либо он покажет мне, выход ...

+0

вам удалось это сделать? – Yashasvi

ответ

2

мне удалось получить, и, наконец, миновали эту ошибку, изменив свою функцию 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; 
3

У меня была такая же проблема сегодня. Отладка 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/секреты/URIs у вас уже есть и код можно получить с отладчиком или добавить некоторые отладки печати в ./vendor/ laravel/socialite/src/Two/GoogleProvider.php - например, в методе getAccessToken ($ code).

Для меня это привело к реальному ответу:

{ 
    "error" : "invalid_client", 
    "error_description" : "The OAuth client was not found." 
} 

После того, как вы это исправить, есть еще один нюанс, который не документированы - Светская необходимо приложение Google, чтобы быть включен Google+ API. Это можно сделать по адресу: https://console.developers.google.com

+0

благодарит за эту информацию. имела ту же ошибку, что позволило g + api решить ошибку – simon

Смежные вопросы