Оставайтесь авторизованными в Google API с Laravel

Я пытался подключиться к API календаря Google с помощью OAuth2. Это работает очень хорошо, но каждый раз, когда сессия закрывается, мне приходится авторизоваться снова и снова.

Моя попытка состояла в том, чтобы сохранить токен обновления и открытый ключ, но это не сработало. Самая большая проблема заключалась в том, что я не знал, как я могу проверить, правильный ли фактический ключ.

Мой код:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Carbon\Carbon;
use App\Termin;
use Google_Client;
use Google_Service_Calendar;
use Google_Service_Calendar_Event;
use Google_Service_Calendar_EventDateTime;


class gCalendarController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {

        $client = new Google_Client();
         $client->setAuthConfig('client_secret.json');
         $client->setScopes('https://www.googleapis.com/auth/calendar');
         $guzzleClient = new \GuzzleHttp\Client(array('curl' => array(CURLOPT_SSL_VERIFYPEER => false)));
         $client->setHttpClient($guzzleClient);
         $client->setAccessType('offline');
         $this->client = $client;

    }


    public function index()
    {
        session_start();
        if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
            $this->client->setAccessToken($_SESSION['access_token']);
            $service = new Google_Service_Calendar($this->client);
            $calendarId = 'primary';
            $results = $service->events->listEvents($calendarId);

           return view('admin.googlecalender')->with('results', $results->getItems());
        } else {
            return redirect()->route('oauthCallback');
        }
    }

    public function oauth()
   {
       session_start();
       $rurl = action('gCalendarController@oauth');

       $this->client->setRedirectUri($rurl);
       if (!isset($_GET['code'])) {
           $auth_url = $this->client->createAuthUrl();
           $filtered_url = filter_var($auth_url, FILTER_SANITIZE_URL);

           return redirect($filtered_url);
       } else {
           $this->client->authenticate($_GET['code']);
           $_SESSION['access_token'] = $this->client->getAccessToken();
           return redirect()->route('admin.dashboard');
       }
   }

   public function store(Request $request)
    {
        session_start();

        if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
            $this->client->setAccessToken($_SESSION['access_token']);
            $service = new Google_Service_Calendar($this->client);
            $calendarId = 'primary';
            $event = new Google_Service_Calendar_Event([
                'summary' => $request['title'],
                'description' => $request['description'],
                'start' => ['dateTime' => Carbon::parse($request['starttime'], 'Europe/Berlin')->toAtomString()],
                'end' => ['dateTime' => Carbon::parse($request['endtime'], 'Europe/Berlin')->toAtomString()],
                'reminders' => ['useDefault' => true],
            ]);
            $results = $service->events->insert($calendarId, $event);
            if (!$results) {
                return response()->json(['status' => 'error', 'message' => 'Something went wrong']);
            }
            return response()->json(['status' => 'success', 'message' => 'Event Created']);
        } else {
            return redirect()->route('oauthCallback');
        }
    }



    public function show($eventId)
   {
       session_start();
       if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
           $this->client->setAccessToken($_SESSION['access_token']);
           $service = new Google_Service_Calendar($this->client);
           $event = $service->events->get('primary', $eventId);
           if (!$event) {
               return response()->json(['status' => 'error', 'message' => 'Something went wrong']);
           }
           return response()->json(['status' => 'success', 'data' => $event]);
       } else {
           return redirect()->route('oauthCallback');
       }
   }

}

Мои маршруты:

Route::resource('/gcalendar', 'GCalendarController');
  Route::get('/oauth', ['as' => 'oauthCallback', 'uses' => 'gCalendarController@oauth']);
  Route::get('/homeOuath', 'gCalendarController@index')->name('homeOuath');

person Eddy05    schedule 27.06.2017    source источник
comment
Вы успешно получили access_token?   -  person Fahmi    schedule 27.06.2017
comment
да. Я могу успешно сохранять события в календаре Google через свое веб-приложение, но когда я пытаюсь сделать это без сеанса, я не могу.   -  person Eddy05    schedule 27.06.2017
comment
Хорошо, позвольте мне взглянуть... Просто чтобы убедиться, что вы имеете в виду это API верно?   -  person Fahmi    schedule 27.06.2017
comment
Это правильный API   -  person Eddy05    schedule 27.06.2017
comment
Я вижу, что вы сохраняете полученный access_token как переменную сеанса, что неверно. Вы должны сохранить его в своей базе данных и связать с вашим сайтом.   -  person Fahmi    schedule 27.06.2017
comment
Да. Я уже пытался сохранить его в своей базе данных, но я не знаю, как проверить правильность токенов.   -  person Eddy05    schedule 27.06.2017
comment
Попробуйте использовать токены обновления, как указано в Обновление токена доступа (офлайн-доступ для API Google. $client-›setAccessType(offline); Полную демонстрацию кода см. здесь web-application-with-public-access">SO post.   -  person noogui    schedule 28.06.2017