oauth2 구글 로그인을 하고나서 얻어온 access token으로 google drive api를 사용하고 있다. GoogleCredenatial로도 잘 작동하지만, 앞으로 지원 종료될지도 모르기 때문에 며칠 삽질하며 코드를 업데이트 했다. 구글은 공식 문서 좀 보기 쉽게 업데이트 해줬음 좋겠다. 매번 찾아보기가 너무 힘들다...
build.gradle
implementation "com.google.apis:google-api-services-drive:v3-rev197-1.25.0"
implementation 'com.google.api-client:google-api-client:1.23.0'//google apis
implementation "com.google.http-client:google-http-client-jackson2:1.39.1"
public static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
public static final HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
public Drive getDriveService(String accessToken) throws IOException {
return new Drive.Builder(
HTTP_TRANSPORT,
JSON_FACTORY, getCredential(accessToken)
)
.setApplicationName("appname").build();
}
public Credential getCredential(String accessToken) {
return new GoogleCredential.Builder()
.setClientSecrets(getClientSecrets())
.setJsonFactory(JSON_FACTORY)
.setTransport(HTTP_TRANSPORT)
.build()
.setAccessToken(accessToken);
}
private GoogleClientSecrets getClientSecrets() {
GoogleClientSecrets clientSecrets = null;
try {
InputStreamReader clientSecretsReader = new InputStreamReader(getSecretFile());
clientSecrets = GoogleClientSecrets.load(JSON_FACTORY);
} catch (IOException e) {
e.printStackTrace();
}
return clientSecrets;
}
private InputStream getSecretFile() throws IOException {
return this.getClass().getResourceAsStream("/client_secret.json"); //client scret 파일 경로(resources 폴더 기준 상대경로)
}
}
build.gradle
implementation 'com.google.api-client:google-api-client:1.33.0'
implementation 'com.google.apis:google-api-services-drive:v3-rev20211107-1.32.1'
implementation 'com.google.http-client:google-http-client-gson:1.19.0'
implementation 'com.google.auth:google-auth-library-oauth2-http:1.3.0'
public Drive getDriveService(String accessToken) throws IOException, GeneralSecurityException {
return new Drive.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
GsonFactory.getDefaultInstance(),
new HttpCredentialsAdapter(getCredentials(accessToken))
)
.setApplicationName("appname")
.build();
}
public GoogleCredentials getCredentials(String accessToken) throws FileNotFoundException, IOException {
return GoogleCredentials.newBuilder()
.setAccessToken(new AccessToken(accessToken, null))
.build();
}
/
* accessToken String 타입이 아니라 AcccessToken타입으로 얻어와서 설정해도 된다. 나는 다른곳에 쓰이는 로직 안고치려고 이렇게 했다.
* accessToken 만료기한을 null 대신 Date 타입으로 줘도 된다. 그런데 임의로 설정한 만큼 유지가 되는지는 모르겠다.
*/
훨씬 간단하고 깔끔해졌다!
+) 서비스 계정으로 자격증명 생성하기
public GoogleCredentials getCredentials() throws FileNotFoundException, IOException {
InputStream serviceSecret = getClass().getResourceAsStream("/service_secret.json"); //resources 기준 상대경로
GoogleCredentials credentials = GoogleCredentials.fromStream(serviceSecret);
credentials = credentials.createScoped(Arrays.asList(DriveScopes.DRIVE)); //scope이 없으면 자격 증명이 제대로 생성이 되지 않는다.
return credentials;
}