Tidak ada spreadsheet yang ditemukan saat menggunakan AppIdentityService untuk mengautentikasi

Saya berhasil mengautentikasi aplikasi mesin aplikasi saya menggunakan AppIdentityService. Namun ketika saya melakukan SpreadsheetService.getEntries saya tidak menerima entri.

Ini kode saya:

SpreadsheetService service = new SpreadsheetService("Spreadsheet editing");
String[] SCOPESArray = { "https://spreadsheets.google.com/feeds" };
final List SCOPES = Arrays.asList(SCOPESArray);
AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(SCOPES);

Credential creds = new Credential(BearerToken.authorizationHeaderAccessMethod());
creds.setAccessToken(accessToken.getAccessToken());    
service.setOAuth2Credentials(creds);

SpreadsheetFeed feed = service.getFeed(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"), SpreadsheetFeed.class);

List spreadsheets = feed.getEntries();

Pada titik ini, spreadsheet adalah Daftar kosong.

Saya telah berbagi spreadsheet dengan aplikasi saya dengan memasukkan email akun layanan di kotak "bagikan" spreadsheet - ini adalah email dalam bentuk: [email protected].

Apakah saya salah memahami izin di sini? Apakah "berbagi" spreadsheet dengan akun layanan tidak cukup untuk membuat akun layanan "melihat" spreadsheet?


person Dan Gravell    schedule 29.05.2015    source sumber


Jawaban (2)


Saat ini saya yakin AppIdentity tidak didukung saat memperbarui menggunakan Sheets API dari Google App Engine.

Tampaknya mungkin untuk mengautentikasi, tetapi daftar SpreadsheetEntrys selalu kosong.

Sebagai gantinya, gunakan akun layanan dari Google App Engine dengan menentukan kredensial dalam instance GoogleCredential:

GoogleCredential creds = new GoogleCredential.Builder()
    .setTransport(GoogleNetHttpTransport.newTrustedTransport())
    .setJsonFactory(JacksonFactory.getDefaultInstance())
    .setServiceAccountId(serviceAccountEmailAddress)
    .setServiceAccountPrivateKeyFromP12File(p12FileFromCredentials)
    .setServiceAccountScopes(SCOPES)
    .build();


service.setOAuth2Credentials(creds);
person Dan Gravell    schedule 01.06.2015

Saya menemukan bahwa berbagi tidak berfungsi dengan baik di Google Docs, yaitu folder "Dibagikan dengan saya" agak tidak lengkap. Hal ini tampaknya telah membaik dengan Drive, tetapi API Spreadsheet sudah kuno...

Yang saya lakukan adalah membagikan folder yang berisi spreadsheet dengan akun layanan App Engine, dan menggunakan API Drive untuk mencantumkan spreadsheet di folder ini. Folder diakses dengan kuncinya. Ini memungkinkan saya mengonfigurasi folder berbeda untuk pengujian unit, pengujian, dan produksi.

Berikut beberapa contoh kode untuk mengambil spreadsheet dari folder:

public enum MimeType { //
  SPREADSHEET ("application/vnd.google-apps.spreadsheet"),
  EXCEL ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

  private String type;
  MimeType(String type) {this.type = type;}

  public String getType() {
    return type;
  }
}

/**
 * Get a list of files of a given type from a folder 
 * 
 * @param folderId The Id of the folder
 * @param type The mime type of the files
 * @return a {@link FileList} containing the desired files
 * @throws IOException
 */
public FileList getFolderItems(String folderId, MimeType type) throws IOException {
    QueryBuilder query = new QueryBuilder();
    query.addParent(folderId).setMimeType(type);
    FileList list = drive.files().list().setQ(query.getQuery()).execute();
    return list;
}

Anda kemudian dapat menggunakan File.getId() untuk mengambil kunci file untuk digunakan dengan API Spreadsheet.

Selain itu, saya menyarankan untuk tidak menggunakan API spreadsheet dari App Engine. API terus-menerus mengalami batas waktu dan pengecualian lainnya saat dipanggil dari GAE. Saya harus memindahkan pemrosesan saya ke tugas antrian yang sayangnya tidak memiliki waktu tunggu URLFetch lebih lama seperti yang dijanjikan (lihat masalah 10470), namun setidaknya, permintaan tersebut tidak dibatalkan.

Saya menulis pembungkus sebagian besar panggilan API Spreadsheet untuk mencoba kembali panggilan tersebut ketika mendapatkan pengecualian. Dan saya terus menambahkan lebih banyak pembungkus.

person Alex R    schedule 30.05.2015
comment
Terima kasih, tapi saya masih belum bisa menerapkannya dengan AppIdentity. Pada akhirnya, beralih menggunakan akun layanan bernama dengan GoogleCredential adalah hal yang berhasil. - person Dan Gravell; 01.06.2015
comment
Saya menggunakan urutan perintah yang sama untuk bekerja dengan API spreadsheet dengan AppIdentity. Apakah Anda mencoba perintah lain menggunakan kunci file tertentu di API? Koneksi Drive saya dibuat dengan kredensial berbeda menggunakan AppIdentityCredential.Builder - person Alex R; 01.06.2015
comment
Halo Alex, Terima kasih atas info Anda, memang lebih baik menggunakan Drive API jika memungkinkan. Satu pertanyaan; bagaimana Anda mengambil Spreadsheet dengan File.getId()? Apakah kamu punya contoh? Salam, Roland - person Roland Beuker; 04.03.2016
comment
@Roland Beuker Saya menggunakan urlFactory.getWorksheetFeedUrl(file.getId(), "private", "full") (atau pembuat url feed lainnya). file.getId() mengembalikan kunci spreadsheet - person Alex R; 04.03.2016
comment
@Alex Dengan beberapa debugging saya menemukan:String lSpreadsheetFileId = pSpreadsheetFile.getId(); String lSpreadsheetUrlString = String.format("https://spreadsheets.google.com/feeds/spreadsheets/%s", lSpreadsheetFileId); URL lSpreadsheetUrl = new URL(lSpreadsheetUrlString); SpreadsheetEntry lSpreadsheetEntry = = mSpreadsheetService.getEntry(lSpreadsheetUrl, SpreadsheetEntry.class); Tapi bagaimana Anda menggunakan WorksheetFeedUrl Anda untuk mendapatkan SpreadsheetEntry? - person Roland Beuker; 04.03.2016
comment
@Roland Beuker saya tidak; apa yang harus saya lakukan dengan SpreadhsheetEntry? Yang bisa dilakukannya hanyalah memberi saya lembar kerja. Yang saya ambil dari WorksheetFeed. - person Alex R; 07.03.2016
comment
Saya membuat perpustakaan dengan kemungkinan untuk bekerja dengan file SpreadsheetService dan GoogleDrive. Dengan solusi di atas satu-satunya perbedaan adalah cara saya mendapatkan SpreadsheetEntry saya. Dari kelas tingkat atas ini semua kodenya bersifat generik ... Saya juga menyukai SpreadsheetEntry karena memodelkan satu spreadsheet seperti apa sebenarnya di dunia nyata. - person Roland Beuker; 07.03.2016
comment
@Roland Beuker Kirimkan pertanyaan dan saya dapat menambahkan beberapa contoh kode. - person Alex R; 07.03.2016
comment
@Alex terima kasih, ini tautan pertanyaan saya: stackoverflow.com/ pertanyaan/35863845/ - person Roland Beuker; 08.03.2016