[친구목록 불러오기 관련 이슈]

안녕하십니까. 바쁘신 와중에 이슈 해결을 위해 힘써주셔서 항상 감사드립니다.
친구 목록을 불러오는 불러오기 위해 스프링부트에서 프로그래밍 중입니다.

현재는 애플리케이션 팀에 등록되고, 동의를 한 팀원들의 목록을 받아오는 단계입니다.

API 테스트를 위해 포스트맨을 활용하여 테스트한 결과 이상없이 카카오 서버에서 데이터를 불러왔지만
스프링부트로 API를 호출하니 403을 반환 하였습니다.
요청주소와 엑세스토큰, 권한에는 문제 없음을 확인하였습니다.

해당 이슈와 관련해서 해답을 알려주시면 감사하겠습니다.

<자바 코드 메서드>
public String requestFriendList(String accessToken, int friendNum) throws IOException{

	String returnMessageLog = "친구목록 불러오기 성공";
	String inPutAccessToken = accessToken; //=> 엑세스 토큰
	URL url = null; 
	HttpURLConnection conn = null;

	try {
		url = new URL(RquestFreindListURL); //=> 요청주소를 담고 있는 변수
		conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");

		log.info("...accessTokem : " + inPutAccessToken); 
		conn.setRequestProperty("Authorization", "Bearer " + inPutAccessToken);
		conn.setDoOutput(true);

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); 
		StringBuilder sb = new StringBuilder();			
		sb.append("&limit=" + friendNum); 
		bw.write(sb.toString());
		bw.flush(); 
		bw.close();

		int responseCode = conn.getResponseCode();
		log.info("...responseCode : " + responseCode); 

		if(responseCode == 403) {
			returnMessageLog = "친구목록 불러오기 실패....";
		}

	} catch(IOException e) {
		returnMessageLog = "친구목록 불러오기 실패....";
		log.info("Error : " + e.toString());
	} finally {

	}

	return returnMessageLog;
}

<포스트맨 결과 > => 민감한 정보는 삭제 혹은 X로 지웠습니다.
{

"elements": [

    {

        "profile_nickname": "김xx",

        "profile_thumbnail_image": "",

        "id": 1,

        "uuid": "JRIlESIVLC8WLx1X",

        "favorite": false

    },

    {

        "profile_nickname": "XX윤",

        "profile_thumbnail_image": "https://p.kg",

        "id": 1736,

        "uuid": "JRYhFHygRKBpU",

        "favorite": false

    },

    {

        "profile_nickname": "박XX",

        "profile_thumbnail_image": "https://p.g",

        "id": 212988,

        "uuid": "JRIkkHSoTKhhJ",

        "favorite": false

    },

    {

        "profile_nickname": "유XX",

        "profile_thumbnail_image": "https://p./g",

        "id": 1244,

        "uuid": "J2E",

        "favorite": false

    }

],

"total_count": 4,

"after_url": null,

"favorite_count": 0

}

안녕하세요~
확인을 위해 앱 ID 알려주세요~


앱ID
https://developers.kakao.com/ 의 내 애플리케이션>앱 설정>요약 정보 : 기본정보에 있는 앱 ID
숫자로된 ID 입니다~
ex) 123456

1개의 좋아요

앱 아이디는 597992 입니다.

가장 최근 에러를 보니 액세스 토큰이 만료된 것으로 보입니다.

this access token is already expired

확인 부탁드려요.


친구 api, 메시지 api 사용을 위한 체크 리스트

1개의 좋아요

엑세스 토큰 재발급하여 다시 시도 하였습니다. 포스트맨에서는 데이터를 불러오나 역시 자바에서는 403을 띄웁니다

2022-02-21 11:00:47.257 INFO 8744 — [ main] KakaoService Start : …responseCode : 403

<포스트맨 >
image

597992 디벨로퍼스앱 오늘로그에는 /v1/api/talk/friends API호출 정상처리 한건 밖에 없는 것을 보니

호출이 잘못된 것 같은데요.

사용하신 코드 블럭 공유 해주세요.

1개의 좋아요

아래 코드는 서비스단에서 자바 코드로 작성한 코드 입니다.

public class KakaoFriendListReq extends KakaoServiceLog implements IKakaoFriendListReq, IKakaoInfo{

final String RquestFreindListURL = "https://kapi.kakao.com/v1/api/talk/friends"; // => 친구목록 엔드 포인트

@Override
public String requestFriendList(String accessToken, int friendNum) throws IOException{
	log.info(this.getClass().getName() + "...request Kakao Freind List Start");
	
	String returnMessageLog = "친구목록 불러오기 성공";
	String inPutAccessToken = accessToken; 
	URL url = null; 
	HttpURLConnection conn = null;

	try {
		url = new URL(RquestFreindListURL); 
		conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		//--------------------------------------요청에 필요한 Header에 포함될 내용 헤더에 포함----------------------------
		log.info("...accessTokem : " + inPutAccessToken); 
		conn.setRequestProperty("Authorization", "Bearer " + inPutAccessToken);
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		//---------------------------------------------------데이터를 보내는 작업부분------------------------------------
		conn.setDoOutput(true);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); 
		StringBuilder sb = new StringBuilder();			
		sb.append("&limit=" + friendNum); 
		bw.write(sb.toString());
		bw.flush(); 
		bw.close(); 
		//--------------------------------------------응답코드 받는 곳-----------------------------------------------------
		int responseCode = conn.getResponseCode();
		log.info("...responseCode : " + responseCode); // => 2xx면 성공, 4xx면 실패

		if(responseCode == 403) {
			returnMessageLog = "친구목록 불러오기 실패....";
		}
		//------------------------------------------------------------------------------------------------------------
	} catch(IOException e) {
		returnMessageLog = "친구목록 불러오기 실패....";
		log.info("Error : " + e.toString());
	} finally {
		log.info(this.getClass().getName() + "...Req Process End");
	}
	log.info(this.getClass().getName() + "...request Kakao Freind List End");
	return returnMessageLog;
}

}

코드상 특이점은 없어보이네요.

토큰이 만료되어 디벨로퍼스 앱을 특정할 수 없었고,

기재해주신 시간대 호출 로그를 보니

2022-02-16T08:58:42+09:00 에 발급 받아 만료된 토큰을 사용했습니다.

파라메터로 전달하는 accessToken 로직 확인 부탁드려요.

1개의 좋아요

image

2022-02-21 12:53:44.031 INFO 7396 — [ main] KakaoService Start : …accessTokem : QLSBvp3ah_ZgIClG8PSfvea19bdn4{보안상 삭제}
2022-02-21 12:53:44.243 INFO 7396 — [ main] KakaoService Start : …responseCode : 403

다시 엑세스 토큰 재발급 하여 매개변수로 던져주어 테스트 돌려 보았지만 똑같습니다… 혹시 로그확인 좀 부탁드려도 될까요?

네, 기재해주신 QLSBvp3ah_ZgIClG8P***** 액세스 토큰으로 사용자 정보조회 이력은 있습니다.
하지만, 597992 디벨로퍼스앱의 /v1/api/talk/friends 이력은 없었습니다.


authorization 헤더에 QLSBvp3ah_ZgIClG8P***** 액세스 토큰을 사용한 실패 요청 로그도 없는 것을 보니
헤더 전달이 제대로 안된 것으로 보입니다.

기재해주신 시간 즈음에 403에러는 헤더 없는 post 방식 요청 밖에 없어서 호출하신 요청을 특정할 수 없는데요.

서버 IP가 ***.76.111.21 인가요?


아래 예제로 테스트 한번 해보시겠어요?

[rest api 예제] java (spring boot) - 카카오 로그인, 카카오 친구목록 조회, 나에게 메시지 발송

1개의 좋아요

네 서버 IP는 ***.76.111.21 맞습니다. 결과적으로 해당 이슈는 해결하였습니다.
버퍼에 담으면 403을 계속 반환 하기에 HttpsURLConnection의 connect() 메서드 사용하여 이슈는 해결을 하였습니다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); 사용하면 403을 반환하는 이슈에 대해서는 지속적으로 확인 해보겠습니다.

바쁘신 와중에 도움 주셔서 감사드립니다 ^^

1개의 좋아요