8

Go で簡単なコマンド ラインの Google ドライブ API を作成しようとしています。今のところ、access_token と refresh_token を取得できるので、アプリケーションの認証に成功しているように思えます。この問題は、トークンを使用して SDK API にアクセスしようとすると発生し、次のエラー メッセージが表示されます。

{
 "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."
 }
}

私が気付いたもう 1 つの奇妙な点は、Google API コンソールにクォータ情報が表示されないことです。それが問題かどうかはわかりません。しかし、私は認証できるので、コンソール API のセットアップに関しては問題ないと思います。

以下は、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)
 }  
4

1 に答える 1

4

これは、次のいずれかの理由で私に起こりました。

  1. リフレッシュ トークンがなく、リフレッシュしようとしていました。
  2. トークンの有効期限が切れていたため、新しいアクセス トークンを取得するには更新トークンが必要でした。
  3. または、最終的に更新トークンを取得しましたが、実際のサイトとテスト サイトでテストできるように、アクセスを取り消してうっかり失効させてしまいました。

最初にトークンの有効期限が切れていないことを確認してください。デフォルトは 3600 秒または 1 時間です。不明な場合は、いつでもトークンを更新できます。

そして、注意が必要なのは、アプリが承認されると、サーバーへの後続のリクエストでリフレッシュ トークンが返されないことです。したがって、最初の認証では更新トークンを取得できますが、後続のリクエストでは取得できません。

リフレッシュ トークンを使用して新しいアクセス トークンを取得するコードは次のようになります。

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;

}

私は Google App Engine を使用しているため、GAEConnectionManager を使用する必要があります。詳細はhttp://peterkenji.blogspot.com/2009/08/using-apache-httpclient-4-with-google.htmlで取得できます。

お役に立てれば!

于 2013-07-18T19:26:52.343 に答える