web-dev-qa-db-ja.com

Google Sheets / Google DriveAPIを使用して特定のファイル権限をリクエストする

Google SheetsAPIを使用してJavaプロジェクトのシートデータを取得しています。すべてローカルで期待どおりに機能しますが、詳細な権限スコープを使用しています https:// www .googleapis.com/auth/Spreadsheets これは「ユーザーのシートとそのプロパティへの読み取り/書き込みアクセスを許可します。」。このアプリにGoogleドライブ内のすべてのスプレッドシートへのアクセスを提供したくない(実行しただけです)一時的にローカルに)。

理想的には、ファイルのIDを使用してファイルへの読み取り/書き込みアクセスの許可を要求したいと思います。これは可能ですか?

不可能な場合は、「アプリによって作成または開かれたファイルへのファイルごとのアクセス」を提供する https://www.googleapis.com/auth/drive.file スコープを推測しています。私が得ることができる最も近いです。このアプリでファイルを開く方法を見つけることができませんでした。どうすればそれを行うことができますか?

または、上記の両方の解決策が理想的または不可能な場合は、推奨事項をお知らせください。

ありがとうございました!

9
Daniel Hunt

スコープは、API全体へのアクセスを許可しますが、単一のファイルまたはファイルのグループに制限する方法はありません。

Google Sheets API、v4スコープ

アクセス許可を単一のファイルに制限する方法はありません。編集しているファイルがアプリケーションによって作成されたと仮定すると、https://www.googleapis.com/auth/drive.fileは有効なオプションである必要があります

サンプル

Javaクイックスタート

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.Java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;

import Java.io.IOException;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.security.GeneralSecurityException;
import Java.util.Collections;
import Java.util.List;

public class SheetsQuickstart {
    private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";

    /**
     * Global instance of the scopes required by this quickstart.
     * If modifying these scopes, delete your previously saved tokens/ folder.
     */
    private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    /**
     * Creates an authorized Credential object.
     * @param HTTP_TRANSPORT The network HTTP Transport.
     * @return An authorized Credential object.
     * @throws IOException If the credentials.json file cannot be found.
     */
    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
        // Load client secrets.
        InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new Java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receier = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receier).authorize("user");
    }

    /**
     * Prints the names and majors of students in a sample spreadsheet:
     * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
     */
    public static void main(String... args) throws IOException, GeneralSecurityException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        final String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
        final String range = "Class Data!A2:E";
        Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();
        ValueRange response = service.spreadsheets().values()
                .get(spreadsheetId, range)
                .execute();
        List<List<Object>> values = response.getValues();
        if (values == null || values.isEmpty()) {
            System.out.println("No data found.");
        } else {
            System.out.println("Name, Major");
            for (List row : values) {
                // Print columns A and E, which correspond to indices 0 and 4.
                System.out.printf("%s, %s\n", row.get(0), row.get(4));
            }
        }
    }
}
1
DaImTo

これがあなたが求めているものだと思います。 ( https://developers.google.com/sheets/api/quickstart/Javahttps://www.youtube.com/watch?v=zDxTSUWaZs4 )Iこのコードを使用して、IDを介してGoogleシートにアクセスしています

public class ConnectToDatabase extends AsyncTask<Object, Integer, Long> {

    private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";
    private static String SPREADSHEET_ID = INSERTYOURIDHERE;
    private static MainActivity main_Activity = null;
    /**
     * Global instance of the scopes required by this quickstart.
     * If modifying these scopes, delete your previously saved tokens/ folder.
     */
    private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
    private static final String CREDENTIALS_FILE_PATH = "credentials.json";


    public ConnectToDatabase(MainActivity mainActivity) {
        this.main_Activity = mainActivity;
    }

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {

        // Load client secrets.
        InputStream in =
                main_Activity.getAssets().open("credentials.json");
        //new FileInputStream(CREDENTIALS_FILE_PATH);
        ConnectToDatabase.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));


        // Build flow and trigger user authorization request.

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(main_Activity.getDir(TOKENS_DIRECTORY_PATH, Context.MODE_APPEND)))
                .setAccessType("offline")
                .build();


        AuthorizationCodeInstalledApp ab = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()){
            protected void onAuthorization(AuthorizationCodeRequestUrl authorizationUrl) throws IOException {
                String url = (authorizationUrl.build());
                        /*flow.newAuthorizationUrl()
                        .setScopes(flow.getScopes())
                        .setAccessType("offline")
                        .setClientId(clientSecrets.getDetails().getClientId())
                        .setRedirectUri("/oauth2-callback")
                        .toString();
*/

                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                main_Activity.startActivity(browserIntent);
            }
        };
        Credential a = ab.authorize("user");


        return a;
    }

    /**
     * Prints the names and majors of students in a sample spreadsheet:
     * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
     */
    public static void main(String[] args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
            final NetHttpTransport HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport();
            final String range = "A1:H";
            Sheets service = null;
            try {
                service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                        .setApplicationName(APPLICATION_NAME)
                        .build();
            } catch (IOException e) {
                e.printStackTrace();
            }
            ValueRange response = null;

            try {
                response = service.spreadsheets().values()
                        .get(SPREADSHEET_ID, range)
                        .execute();
            } catch (IOException e) {
                e.printStackTrace();
            }

            List<List<Object>> values = response.getValues();
            [...]
    }
}

必要に応じて、このコードスニペットを少し変更する必要があるかもしれません。私はこれを私のアプリの一部として使用しました。

では、このコードは何をするのでしょうか?実行時に、このコードは、credentials.jsonという名前の個人用APIキーを使用してGoogleに接続します。 (次の場所で独自に作成してください: https://developers.google.com/+/web/api/rest/oauth )認証が成功すると、特定のIDでGoogleスプレッドシートにアクセスできるようになります。 。

0
dnsiv

これはかなり前に投稿されたものですが、将来これに遭遇する将来の開発者を支援するために私の答えを提供します。

サービスアカウントを使用すると、ここで探している機能が得られると思います。サービスアカウントは、ユーザーがドキュメントを共有できる「ボット」ユーザーのようなものであり、サーバーはこのサービスアカウントにログインしてそれらのドキュメントにアクセスできます。ユーザーのグーグルドライブ全体またはグーグルシートへのアクセスを要求する代わりに、手動でドキュメントを共有することができます。これは、ほとんどのユーザーにとってより快適だと思います。

ここに例があります これをNode.jsで設定する方法の例ですが、アイデアはかなり簡単にJavaに変換されるはずです。

0
Spiritman110