access token으로 구글 자격증명 가져오기(feat. google drive api)

sangeun jo·2022년 6월 23일
0

사내결재사이트

목록 보기
6/7

oauth2 구글 로그인을 하고나서 얻어온 access token으로 google drive api를 사용하고 있다. GoogleCredenatial로도 잘 작동하지만, 앞으로 지원 종료될지도 모르기 때문에 며칠 삽질하며 코드를 업데이트 했다. 구글은 공식 문서 좀 보기 쉽게 업데이트 해줬음 좋겠다. 매번 찾아보기가 너무 힘들다...

1. GoogleCredenatial 클레스에서 access token으로 자격증명을 가져오는 방법(더이상 사용되지 않음)

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 폴더 기준 상대경로) 
    }
}

2. GoogleCredenatials 클레스에서 access token으로 자격증명을 가져오는 방법

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; 
} 
profile
코더가 아니라 개발자가 되자

0개의 댓글