Spring

Java Google API 인증-앱에서 URL 방문을 요청하는 단계를 생략 할 수있는 방법이 있습니까?

기록만이살길 2021. 3. 23. 07:04
반응형

Java Google API 인증-앱에서 URL 방문을 요청하는 단계를 생략 할 수있는 방법이 있습니까?

1. 질문(문제점):

내 Spring 애플리케이션에서 다음과 같은 Google Authorization 구현을 사용하고 있습니다.

public Credential authenticate(final NetHttpTransport httpTransport) throws IOException {
        Optional<InputStream> credentialsInputStream = Optional.ofNullable(AuthenticationService.class.getResourceAsStream(credentialsFilePath));

        GoogleClientSecrets clientSecrets =
                GoogleClientSecrets.load(
                        jsonFactory,
                        new InputStreamReader(credentialsInputStream
                                .orElseThrow(() -> new FileNotFoundException("Resource not found: " + credentialsFilePath))));

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                httpTransport, jsonFactory, clientSecrets, authenticationScopes)
                .setDataStoreFactory(new FileDataStoreFactory(new File(tokensDirectoryPath)))
                .setAccessType(ACCESS_TYPE)
                .build();

        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(AUTHENTICATION_RECEIVER_PORT).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize(TECHNICAL_USER_ID);
    }

이 솔루션은 콘솔에 Google 인증 URL이 표시됩니다.

Please open the following address in your browser:
  https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=1234567890.apps.googleusercontent.com&redirect_uri=http://localhost:8888/Callback&response_type=code&scope=https://www.googleapis.com/auth/drive%20https://www.googleapis.com/auth/spreadsheets%20https://www.googleapis.com/auth/calendar
Attempting to open that address in the default browser now...

문제는 앱에서 URL 방문을 요청할 때이 단계를 생략 할 수있는 방법이 있습니까? 이상적인 상황은 사용자 / 개발자 / 운영자의 조치없이 전체 프로세스가 완전히 자동으로 진행될 수있는 경우입니다.

2. 해결방안:

그것은 당신이하는 일에 달려 있습니다.

개인 사용자 데이터에 액세스하려면 해당 사용자의 데이터에 액세스 할 수있는 권한이 필요합니다. 그게 동의 화면이하는 일입니다. 사용자가 데이터에 액세스 할 수있는 애플리케이션 권한을 부여하도록 요청합니다. 따라서 내 드라이브 계정, 시트 및 캘린더 계정에 액세스하려면 내 권한이 필요하며 해당 권한을 얻으려면 해당 URL을 표시해야합니다.

다음 API에 액세스하는 것 같습니다.

실제로 develoepr이 제어하는 ​​단일 계정에 액세스하려고하는 개인 사용자 데이터에 액세스하려고하지 않는다고 가정합니다. Google 드라이브에 사용자에게 표시하려는 표준 파일이 있고 사용자에게 표시하려는 내부 Google 캘린더가 있습니다. 이 경우 이것은 사용자가 소유 한 데이터가 아니라 개발자가 소유하고 제어하는 ​​데이터입니다.

이 경우 서비스 계정이라고하는 것을 사용할 수 있습니다. 서비스 계정은 기술적으로 사용자가 소유 한 데이터가 아니므로 사용자의 액세스를 요청하지 않고이 내부 데이터에 액세스 할 수 있도록 애플리케이션을 사전 승인 할 수있는 기능을 제공합니다.

서비스 계정

Google 개발자 콘솔로 이동하여 서비스 계정 자격 증명을 만듭니다. 다음 코드를 사용하면 서비스 계정에 액세스 할 수 있습니다.

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential credential = GoogleCredential
        .fromStream(new FileInputStream(KEY_FILE_LOCATION))
        .createScoped(AnalyticsReportingScopes.all());

서비스 계정은 자체 더미 사용자이므로 Google 드라이브 계정에서 파일을 업로드 할 수 있습니다. 또는 서비스 계정 이메일 주소를 사용하여 서비스 계정과 파일 또는 디렉토리를 공유 할 수 있습니다. 다른 사용자처럼 웹 애플리케이션을 통해이 작업을 수행하십시오.

참고 : Google은 서비스 계정이 Google 캘린더와 함께 작동하는 방식을 약간 변경하는 것으로 보입니다. 수행중인 작업에 따라 서비스 계정 액세스가 제한 될 수 있으며 이는 일반적으로 이벤트 초대 전송과 관련이 있습니다.

65666576
반응형