2016-04-22 40 views
6

Gli utenti autorizzano nella mia applicazione Android. E sto inviando token degli utenti e altre informazioni al mio server. In questo server voglio implementare una logica per gli utenti.Come posso raggiungere le informazioni del calendario degli utenti sul server?

Voglio avere esattamente this flow.

Ho seguito i passaggi quickstart.php in this link per ottenere i calendari degli utenti sul server.

ma ottengo l'errore seguente:

google oauth exception' with message 'could not json decode the token'

Per questo motivo ho provato this solution. Ma prendo lo stesso errore. Quindi come terza opzione ho creato il formato JSON come nello this solution come di seguito.

$access_token = '{ 
    "access_token":'.$access_token.', 
    "token_type":"Bearer", 
    "expires_in":3600, 
    "id_token":'.$id_token.', 
    "refresh_token":" ", 
    "created":'. time() .' 
}'; 

come si vede, non so come scambiare token di aggiornamento. Ho cercato come ottenere un token di aggiornamento e ho visto this question. E ha implementato this solution nel mio codice ma non è cambiato nulla.

Modifica 4: Ho cercato di ottenere il token di accesso according to this answer nell'applicazione Android e inviarlo al server delle applicazioni. Sto prendendo il codice come prima di me:

GoogleSignInAccount acct = result.getSignInAccount(); 
code = acct.getServerAuthCode();//sending this code to AsyncTask to get access token 

mia funzione per ottenere token di accesso:

private void getAccessToken()throws GoogleAuthException, IOException{ 
    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      List<String> scopes = new LinkedList<String>(); 
       scopes.add("https://www.googleapis.com/auth/calendar"); 
       scopes.add("https://www.googleapis.com/auth/calendar.readonly"); 
       scopes.add("https://www.googleapis.com/auth/urlshortener"); 

       GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, client_id, client_secret, scopes).build(); 

       try{ 
        GoogleTokenResponse res = flow.newTokenRequest(code).execute(); 
        accessToken = res.getAccessToken(); 
       }catch(IOException e){ 
       } 

al lato server PHP ho cambiato user-example.php di file po 'come qui di seguito perché ho il token di accesso ora:

$client = new Google_Client(); 
$client->setClientId($client_id); 
$client->setClientSecret($client_secret); 
$client->setAccessType("offline"); 
$client->setRedirectUri($redirect_uri); 
$client->addScope("https://www.googleapis.com/auth/urlshortener"); 
$service = new Google_Service_Urlshortener($client); 
if (isset($_REQUEST['logout'])) { 
    unset($_SESSION['access_token']); 
} 
$client->setAccessToken('{"access_token":"'. $access_token .'","token_type":"Bearer","expires_in":3600,"created":'. time() .'}'); 
if ($client->getAccessToken() && isset($_GET['url'])) { 
$url = new Google_Service_Urlshortener_Url(); 
$url->longUrl = $_GET['url']; 
$short = $service->url->insert($url); 
$_SESSION['access_token'] = $client->getAccessToken(); 

Ma ora sto ottenendo sotto l'errore:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/urlshortener/v1/url : (403) Insufficient Permission' in C:\wamp\www\google-php\src\Google\Http\REST.php on line 110

+0

Le variabili tra virgolette singole non vengono valutate. Rompi la stringa aperta per le variabili. '$ sp = 'ciao sono'. $ nome. ' e scrivo stringhe. '; ' –

+0

Ho ancora lo stesso errore di decodifica di JSON. : \ – melomg

+0

Se questi due token non sono numeri interi, inseriscili tra virgolette. –

risposta

2

Errore di autorizzazione insufficiente dopo che ho iniziato a utilizzare GoogleAuthorizationCodeFlow per ottenere token di accesso come indicato nel mio OP. E poi ho provato ad aggiungere lo scope del calendario a GoogleApiClient.Builder(this) ma ottengo errore come se non aggiungessi scope se aggiungo Auth.GOOGLE_SIGN_IN_API perché ho aggiunto Auth.GOOGLE_SIGN_IN_API a GoogleApiClient.Builder. Quindi questa volta ho provato ad aggiungere l'ambito a GoogleSignInOptions.Builder e ora funziona. Sono in grado di ottenere sia token di aggiornamento che token di accesso. Sotto codice risolto il mio problema:

GoogleSignInOptions gso = state.getGso(); 
if(gso == null){ 
    gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestScopes(new Scope("https://www.googleapis.com/auth/calendar")) 
     .requestIdToken(getString(R.string.server_client_id)) 
     .requestEmail() 
     .requestServerAuthCode(getString(R.string.server_client_id), false) 
     .requestProfile() 
     .build(); 
} 
+0

Ciao! Potresti per favore aiutarmi con google disconnettersi? Penso che dovessi implementarlo nella tua app se lavori con googleAuth ... Ho questo problema, ho implementato logIn nella prima attività, ma il pulsante LogOut l'ho implementato su un'altra attività e poi se clicco su questo pulsante invoco 'Auth. GoogleSignInApi.revokeAccess (mGoogleApiClient) 'e ottieni l'errore' GoogleApiClient non è ancora connesso. Per quanto ne capisco ho capito perché è un'entità diversa quando eseguo il log in e logout ... ma come posso salvare lo stesso entità? In che modo l'hai implementato nella tua app? –

+0

Non riesco a testare il progetto perché non ho un server ora. E per quanto ho capito dai miei codici: D, ricordo attività di accesso con flag diversi e in accesso alla funzione onConnected sto controllando questo flag. Se il flag è true, chiamo semplicemente la funzione 'Auth.GoogleSignInApi.signOut' impostando il callback dei risultati. Ma sono abbastanza sicuro che questo non è un buon modo per raggiungere questo obiettivo. Inoltre ci sono modi per memorizzare un valore come globale. Puoi guardare [questo link] (http://stackoverflow.com/a/1945297/3918109) e dopo aver ottenuto l'oggetto 'mGoogleApiClient', puoi verificare se è connesso. – melomg

+0

per quanto mi ricordo il metodo 'onConnected()' è stato fornito in precedenza su ver google auth ... nell'ultima implementazione è una differenza ... non ho questo metodo nella mia implementazione (ma ottengo il tuo punto di vista –