자바 스크립트로 카카오톡 로그인을 구현하고 있습니다.
그런데 accessToken과 refreshToken이 잘 넘어 오는 것 같은데 막상 나에게 메시지 보내기를 할 때 401에러가 떳습니다. 확인해보니 토큰이 만료된 것일 수 있다고 하여 확인 차 문의 드렸습니다.
export const getToken = async (authCode) => {
const header = {headers: {“Content-Type”: “application/x-www-form-urlencoded;charset=utf-8”}}
// URLSearchParams를 사용하여 파라미터를 form-data 형식으로 변환
const params = new URLSearchParams();
params.append(‘grant_type’, ‘authorization_code’);
params.append(‘client_id’, rest_api_key);
params.append(‘client_secret’, client_secret); // client_secret 추가
params.append(‘redirect_uri’, redirect_uri);
params.append(‘code’, authCode);
try {
const res = await axios.post(access_token_url, params, header);
const accessToken = res.data.access_token;
const refreshToken = res.data.refresh_token;
return { accessToken, refreshToken }; // 두 토큰 반환
} catch (error) {
console.error(‘Token Error:’, error.response?.data || error);
throw error;
}
}
export const getMemberWithToken = async (accessToken, refreshToken) => {
try {
const res = await axios.get(${API_SERVER_HOST}/api/member_copy/kakao
, {
params: {
accessToken: accessToken, // 파라미터 이름을 정확히 일치시킴.
refreshToken: refreshToken
}
});
console.log("------------------",res);
return res.data
} catch (error) {
console.error(‘Member API Error Response:’, error.response?.data);
throw error;
}
이렇게 하면 받을 수 있길래 백에서 저장을 한번 해서 그 토큰을 사용해 보았는데 401에러가 떳습니다.
자바에서
private String updateKakaoAccessToken(Member member, String refreshToken) {
String tokenUrl = “https://kauth.kakao.com/oauth/token”;
String restApiKey = “myKey”;
try {
// 토큰 갱신을 위한 요청 파라미터
String postParams = "grant_type=refresh_token"
+ "&client_id=" + restApiKey
+ "&refresh_token=" + refreshToken;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<String> entity = new HttpEntity<>(postParams, headers);
// RestTemplate을 사용하여 요청 전송
ResponseEntity<String> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, entity, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
JSONObject jsonResponse = new JSONObject(response.getBody());
String newAccessToken = jsonResponse.getString("access_token");
// 새로운 access token 저장
member.updateKakaoAccessToken(newAccessToken);
// 새로운 refresh token이 있으면 저장
if (jsonResponse.has("refresh_token")) {
String newRefreshToken = jsonResponse.getString("refresh_token");
member.updateKakaoRefreshToken(newRefreshToken);
}
memberRepository.save(member);
return newAccessToken;
} else {
log.error("액세스 토큰 갱신 실패. 응답 코드: {}", response.getStatusCode());
return null;
}
} catch (HttpClientErrorException e) {
// HTTP 오류 응답 처리
if (e.getStatusCode() == HttpStatus.FORBIDDEN) {
String errorResponse = e.getResponseBodyAsString();
JSONObject jsonResponse = new JSONObject(errorResponse);
// 오류 메시지와 상세 내용 로그 출력
log.error("권한 오류 발생: {}", errorResponse);
log.error("필요한 권한: {}", jsonResponse.optJSONArray("required_scopes"));
log.error("허용된 권한: {}", jsonResponse.optJSONArray("allowed_scopes"));
} else {
log.error("액세스 토큰 갱신 중 오류 발생: {}", e.getMessage(), e);
}
return null;
} catch (Exception e) {
log.error("액세스 토큰 갱신 중 알 수 없는 오류 발생: ", e);
return null;
}
}
이렇게 refreshToken으로 accessToken을 갱싱하는 코드를 만들어 써보았는데도 되지 않았습니다. 에러는 액세스 토큰 갱신 중 오류 발생:이 떳습니다.
혹시 이게 메시지 권한 때문인지 아니면 코드의 문제인지 모르겠습니다.