首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel 5中使用口香糖和社交软件向Google提出请求

在Laravel 5中使用口香糖和社交软件向Google提出请求
EN

Stack Overflow用户
提问于 2015-03-30 09:19:03
回答 2查看 6.9K关注 0票数 3

我正在构建一个web应用程序,它必须与Google进行交互,并检索经过身份验证的用户的联系人列表,但我正在获得

代码语言:javascript
复制
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发出口吻请求,并通过将它存储在会话变量中来发送正确的访问令牌,但我仍然得到了一个禁止的响应:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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和应用oAuth 2的社交网站等软件包。我真的很难充分利用我有限的知识,也没有真正在网上找到很多文档,问题是我的雇主暗示我要么必须尽快完成这件事,要么他会给我指路.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 15:39:02

我设法克服了这个错误,将我的getContactList函数更改为以下内容,并添加了适当的范围:

代码语言:javascript
复制
 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;
票数 2
EN

Stack Overflow用户

发布于 2015-03-30 11:00:47

我今天也遇到了同样的问题。调试社交名流,我发现对google的get授权令牌调用存在问题。

最后,它只是客户端的秘密拷贝-错误地粘贴到配置。

要发现真正的问题来源,您可以尝试以下命令:

代码语言:javascript
复制
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

您已经拥有的客户机in /机密/uris,可以通过调试器获得代码,或者在./vendor/laravel/socialite/src/Two/GoogleProvider.php中添加一些调试打印,例如在getAccessToken($code)方法中。

对我来说,这是一个真实的答案:

代码语言:javascript
复制
{
  "error" : "invalid_client",
  "error_description" : "The OAuth client was not found."
}

一旦你解决了这个问题,还有一个没有记录的警告&社交名流需要你的Google+应用程序来启用Google+。这可以在:https://console.developers.google.com上完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29342470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档