2013-06-03 9 views
8

Próbuję napisać prostą aplikację google drive api w Go. Wydaje mi się, że do tej pory udało mi się uwierzytelnić aplikację, ponieważ mogę uzyskać access_token i refresh_token. Problem dzieje się przy próbie dostępu do API SDK za pomocą tokena, pojawia się komunikat o błędzie poniżejLimit dzienny nieuwierzytelnionego użycia został przekroczony

{ 
"error": { 
"errors": [ 
{ 
    "domain": "usageLimits", 
    "reason": "dailyLimitExceededUnreg", 
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", 
    "extendedHelp": "https://code.google.com/apis/console" 
} 
], 
"code": 403, 
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." 
} 
} 

Innym dziwne rzeczą, jaką zauważyłem jest to, że nie widzę żadnych informacji kwot mojej konsoli Google API. Więc nie jestem pewien, czy to jest problem. Ale ponieważ mogę być uwierzytelniony, wtedy myślę, że powinienem czuć się dobrze w terminach konfiguracji konsoli.

Poniżej znajduje się kod dla zapytania api

accessUrl := "https://www.googleapis.com/drive/v2/files" + "?access_token=\"" + accessToken + "\"" 
if res , err := http.Get(accessUrl); err == nil { 
     if b, err2 := ioutil.ReadAll(res.Body); err2 == nil { 
      fmt.Println(string(b)) 
     }else{ 
      fmt.Println(err2) 
     } 
}else{ 
    fmt.Println(err) 
} 
+3

Ok, udało mi się rozwiązać problem. Wydaje się, że popełniłem ten sam błąd, co wielu innych ludzi. Zapomniałem włączyć "Drive API" w konsoli API. Kiedy to zrobiłem, wszystko działało dobrze. Komunikat o błędzie jest naprawdę mylący. Mam nadzieję, że to pomoże komuś – tabiul

+0

tnx na rozwiązanie, pomaga! :) –

+1

gdzie jest Drive API? Jak włączyć? – sureshvv

Odpowiedz

4

To zdarzyło się do mnie, bo albo:

  1. nie mam odświeżenie tokena i starałem się odświeżyć.
  2. Mój token wygasł. W tym przypadku potrzebowałem odświeżającego tokena, aby uzyskać nowy token dostępu.
  3. Albo w końcu miałem odświeżony token, ale przypadkowo go wygasłem, odwołując dostęp, więc mogłem przetestować na stronie na żywo w stosunku do strony testowej.

Najpierw sprawdź, czy token nie wygasł, domyślnie 3600 sekund lub godzinę, a następnie, jeśli nie masz pewności, zawsze możesz odświeżyć token.

Pamiętaj też, że gdy aplikacja zostanie autoryzowana, kolejne żądania do serwera nie zwrócą odświeżającego tokena, co moim zdaniem jest głupie, ale niezależnie od tego jest. Tak więc pierwsze uwierzytelnienie możesz uzyskać odświeżenie tokena, w przeciwieństwie do kolejnych żądań, których nie możesz.

Moje kodu dla uzyskania nowego tokenu dostępu za pomocą tokena odświeżania wygląda następująco:

public static String refreshtoken(String refreshToken, SystemUser pUser) throws IOException { 
    HttpParams httpParams = new BasicHttpParams(); 
    ClientConnectionManager connectionManager = new GAEConnectionManager(); 
    HttpClient client = new DefaultHttpClient(connectionManager, httpParams); 
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token"); 

    List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
    pairs.add(new BasicNameValuePair("refresh_token", refreshToken)); 
    pairs.add(new BasicNameValuePair("client_id", "YOUR_CLIENT_ID")); 
    pairs.add(new BasicNameValuePair("client_secret", "YOUR_CLIENT_SECRET")); 
    pairs.add(new BasicNameValuePair("grant_type", "refresh_token")); 

    post.setEntity(new UrlEncodedFormEntity(pairs)); 
    org.apache.http.HttpResponse lAuthExchangeResp = client.execute(post); 
    String responseBody = EntityUtils.toString(lAuthExchangeResp.getEntity()); 
    ObjectMapper mapper = new ObjectMapper(); // can reuse, share 
               // globally 
    Map<String, Object> userData = mapper.readValue(responseBody, Map.class); 

    String access_token = (String) userData.get("access_token"); 
    String token_type = (String) userData.get("token_type"); 
    String id_token = (String) userData.get("token_type"); 
    String refresh_token = (String) userData.get("refresh_token"); 

    return access_token; 

} 

używam Google App Engine iw efekcie musiał użyć GAEConnectionManager, masz te dane tutaj: http://peterkenji.blogspot.com/2009/08/using-apache-httpclient-4-with-google.html.

Mam nadzieję, że to pomoże!

Powiązane problemy