2016-06-22 4 views
0

Ich erstelle eine Android-App, die mit einer CakePHP 3-Web-API verbunden ist. Da sich eine RESTful-API nicht auf Cookies verlassen kann, verstehe ich, dass ich JSON-Web-Token (JWT) benötige, um dies zu ermöglichen, und dass ich eine Google-Anmeldung bevorzugen würde. Ich habe bereits die Android-Seite, um ein Token von Googles API anzufordern, aber jetzt bin ich verloren, wie ich dies in meine API für die Authentifizierung einbinden kann.So integrieren Sie den Google-Login in eine CakePHP-REST-API

Ich habe für einige Tutorials gesucht, wie dieses: http://blog.jainsiddharth21.com/2013/04/29/login-with-google-in-cakephp/, aber es beruht auf Sitzungsdaten. Ich baue die API in CakePHP 3, also habe ich mir einige der Plugins angeschaut, zum Beispiel ADmad/JwtAuth, also könnte ich vielleicht auf diese erweitern, um Google-Authentifizierung zu erlauben, aber ich bin mir nicht sicher, wie.

+0

Bitte schauen Sie auf diesen Link https://github.com/hareshpatel1990/cakephp3restapi hoffen, das wird Ihnen helfen ... –

+0

eine ordnungsgemäße Rest API verwendet keine Sitzung, daher müssen Sie mit jeder Anfrage eine Art Authentifizierung senden, JWT ist der beste Weg, dies zu erreichen! – Voycey

+0

@HareshKumar Das ist aus dem gleichen Tutorial, mit dem ich verlinkt habe, und trotzdem, ich folgte ihm genau und es generiert die Token, aber die Authentifizierung schlägt immer fehl, wenn ich den Header 'Authorization: Bearer my-long-token-here' habe. – tyjkenn

Antwort

1

Anmeldung mit Google Mail und spezifischer E-Mail-Adresse erlaubt in CakePHP 3.x

Komponisten anmelden

"google/apiclient": "^2.0" 

Pflicht gmail mit Login

https://console.developers.google.com/apis/credentials?project=mdpms-187410&organizationId=1095988912954

erstellen zu installieren Projekt und erstellen geheimer Schlüssel und Client-ID

Projekt in Setnamen und umleiten URL

HINWEIS: - Umleitung URL .com und .org-Domain sein muss Wenn Sie in der lokalen Maschine entwickeln dann folgt Art von virtueller Host example.com und example.org erstellen

virtuellen Host erstellen dann Folgen Sie diesem Schritt:

Set-Konfigurationsdatei in app_globle.php

'Google' => 
[ 
     'googleClientID' => '123456.apps.googleusercontent.com', 
     'googleClientSecret' => 'abcdefghi', 
     'googleRedirectUrl' => 'http://example.com/oauth2callback' 
    ] 

Google Mail-Login Route

// Google Login

$routes->connect('/account/google-login', ['controller' => 'Account', 'action' => 'googlelogin'], ['_name' => 'account-google-login']); 


$routes->connect('/oauth2callback', ['controller' => 'Account', 'action' => 'confirmlogin'], ['_name' => 'account-google-redirect-url']); 

Google Login Aktionscode:

/** 
* Gmail login method 
*/ 

    public function googlelogin() 
    { 


$client = new Google_Client(); 
    $client->setClientId(Configure::read('Google.googleClientID')); 
    $client->setClientSecret(Configure::read('Google.googleClientSecret')); 
    $client->setRedirectUri(Configure::read('Google.googleRedirectUrl')); 
    $client->se 

tScopes([ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      'https://www.googleapis.com/auth/userinfo.email' 
     ]); 
     $url = $client->createAuthUrl(); 
     $this->redirect($url); 
    } 

Google URL-Aktion

/**umleiten* Gmail Auth Umleitung Aktion * @return Typ gmail Auth Daten */

public function confirmlogin() 
    { 
     $client = new Google_Client(); 
     $client->setClientId(Configure::read('Google.googleClientID')); 
     $client->setClientSecret(Configure::read('Google.googleClientSecret')); 
     $client->setRedirectUri(Configure::read('Google.googleRedirectUrl')); 
     $client->setScopes([ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      'https://www.googleapis.com/auth/userinfo.email' 
     ]); 
     $client->setApprovalPrompt('auto'); 
     $usersTable = TableRegistry::get('Users'); 
     if (isset($this->request->query['code'])) { 
      $client->authenticate($this->request->query['code']); 
      $this->request->Session()->write('access_token', $client->getAccessToken()); 
     } 
     if ($this->request->Session()->check('access_token') && ($this->request->Session()->read('access_token'))) { 
      $client->setAccessToken($this->request->Session()->read('access_token')); 
     } 
     if ($client->getAccessToken()) { 
      $this->request->Session()->write('access_token', $client->getAccessToken()); 
      $oauth2 = new Google_Service_Oauth2($client); 
      $user = $oauth2->userinfo->get(); 
      try { 
       if (!empty($user)) { 
        if ((preg_match("/(@example\.com)$/", $user['email'])) || (preg_match("/(@example\.in)$/", $user['email']))) { 
         $result = $usersTable->find('all') 
           ->where(['email' => $user['email']]) 
           ->first(); 
         if (!empty($result)) { 
          $this->AccessControl->setUser($result->toArray(), false); 
          $this->Flash->set(__('You have successfuly logged in.'), ['element' => 'success']); 
          $this->redirect(['_name' => 'dashboard']); 
         } else { 
          $data = []; 
          $data['email'] = $user['email']; 
          $data['first_name'] = $user['givenName']; 
          $data['last_name'] = $user['familyName']; 
          $data['socialId'] = $user['id']; 
          $data['role_id'] = Configure::read('Role.loginWithGmailUserRole'); 
          //$data matches my Users table 
          $entity = $usersTable->newEntity($data); 
          if ($usersTable->save($entity)) { 
           $data['id'] = $entity->id; 
           $this->AccessControl->setUser($data, false); 
           $this->Flash->set(__('You have successfuly logged in.'), ['element' => 'success']); 
           $this->redirect(['_name' => 'dashboard']); 
          } else { 
           $this->Flash->error(__('Invalid login.')); 
      //redirect to login action 
           $this->redirect(['_name' => 'account-login']); 
          } 
         } 
        } else { 
         $this->Flash->error(__('Your email is invalid for this application.')); 
     //redirect to login action 
         $this->redirect(['_name' => 'account-login']); 
        } 
       } else { 
        $this->Flash->error(__('Gmail infos not found.')); 
     //redirect to login action 
        return $this->redirect(['_name' => 'account-login']); 
       } 
      } catch (\Exception $e) { 
       $this->Flash->error(__('Gmail error.')); 
       return $this->redirect(['_name' => 'account-login']); 
      } 
     } 
    } 
Verwandte Themen