본문 바로가기
FullStack/21. Java

Azure Active Directory SSO - 사용자 프로파일(3)

by nakanara 2023. 9. 29.
반응형

AD에 있는 로그인 프로파일 가져오는 방법입니다.

SSO 성공 시 accessToken이 발급되며, 발급된 Token을 이용하여 프로파일 정보 접근 후 이미지 파일을 내려받는 소스입니다.

로그인 이후 프로파일 사진 다운로드

{
    // 로그인 시점에서 전달된 accessToken 정보
    final String accessToken = filteredClaims.get("accessToken");

    TokenCredential tokenCredential = new TokenCredential() {
        @Override
        public Mono<AccessToken> getToken(TokenRequestContext tokenRequestContext) {
            // 비동기적으로 AccessToken을 생성하고 반환하는 예제
            return Mono.just(new AccessToken(accessToken, null));
        }
    };

    TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(tokenCredential);


    // GraphServiceClient 생성
    GraphServiceClient<Request> graphClient = GraphServiceClient.builder()
            .authenticationProvider(tokenCredentialAuthProvider)
            .buildClient();

    // 사용자 프로필 정보 가져오기
    User me = graphClient.me().buildRequest().get();

    // 프로필 사진 가져오기
    //ProfilePhoto profilePhoto = graphClient.users(me.id).photo().buildRequest().get();

    // 프로필 사진 다운로드 및 저장
    ProfilePhotoRequestBuilder profilePhotoRequestBuilder = graphClient.users(me.id).photo();

    try {
        String filePath = GlobalConfig.getInstance().getFilePath();
        InputStream photoStream = profilePhotoRequestBuilder.content().buildRequest().get();

        // 서버에 저장
        savePhotoToFile(photoStream, filePath + "/photo", "profile_" + userId + ".jpg");
    }catch(Exception e) {
        Log.biz.debug("photo not found = {}", e);
    }

}

이미지 파일 저장

/**
* 파일 저장
**/
private static void savePhotoToFile(InputStream inputStream, String dir, String fileName) throws IOException {

    File fileDir = new File(dir);
    if (!fileDir.exists())
        fileDir.mkdirs();

    File photoFile = new File(dir + "/" + fileName);

    try (FileOutputStream outputStream = new FileOutputStream(photoFile)) {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
    }
}
반응형