카카오 토큰발급 에러코드 KOE010

문의 사항에 따라 필요한 정보를 먼저 입력하시면 더 빠르게 대응해 드릴 수 있습니다.

  • 개발 과정에서 문제가 있을 경우
    • 앱 아이디(app ID): 1005591
    • 호스팅 사:
    • 서비스 URL : https://gogorentcar.fifteenh.io
    • 오류 내용 :
      토큰발급요청(https://kauth.kakao.com/oauth/token) 시 401 오류
      ‘grant_type’ => ‘authorization_code’,
      ‘client_id’ => rest api 앱 키,
      ‘redirect_uri’ => KAKAO_TOKEN_CALLBACK_URL_DEV,
      ‘code’ => ‘gqpUKZU5mZb9IE3uymP0oAbtp7GXjF1Dm6Fu8gpMcRThpvCn5zfnflceAeQKKw0fAAABjrw_kdio9NUiJo7xnA’,
      ‘client_secret’ => 발급받은 client_secret,

오류 내용
Array
(
[error] => invalid_client
[error_description] => Bad client credentials
[error_code] => KOE010
)

KOE010 오류면 client_secret 이 일치하지않는 것이라고 알고 있는데, 확인 결과 일치한 것으로 파악됩니다. 다른 부분에서 잘못 설정된 값이 있는지 확인 부탁드립니다.

안녕하세요.

구현하신 코드 공유 부탁드립니다.

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

use restfulApi\RestfulApi;

define('FILE_NAME', 'kakaoAuthCallback');
define('KAKAO_TOKEN_URL', 'https://kauth.kakao.com/oauth/token');
define('SERVER_HOST_NAME_PROD', 'homeadmin.grimsys.com');
define('KAKAO_TOKEN_CALLBACK_URL_DEV', 'https://homeadmindev.grimsys.com/backend/api/socialLogin/kakaoTokenCallback.php');
define('KAKAO_TOKEN_CALLBACK_URL_PROD', 'https://homeadmin.grimsys.com/backend/api/socialLogin/kakaoTokenCallback.php');

try
{
    require_once $_SERVER['DOCUMENT_ROOT'] . '/backend/common/RestfulApi.php';

    $code = $_GET['code'];
    $state = $_GET['state'];
    $error = $_GET['error'];
    $errorDescription = $_GET['error_description'];

    if ($error)
    {
        echo json_encode([
            'result' => FALSE,
            'code' => $error,
            'message' => $errorDescription,
        ]);

        exit();
    }

    $token = callKakaoTokenApi($code);

} catch (Exception $e)
{
    $server_exception = new GogoAdminServerException($e->getMessage(), $e->getCode());
    $server_exception->errorReport(PLATFORM_TYPE, FILE_NAME, 0);

    echo json_encode(['result' => $e->getCode()]);
}

function callKakaoTokenApi($code)
{
    $restfulApi = new RestfulApi();
    $isProd = $_SERVER['HTTP_HOST'] === SERVER_HOST_NAME_PROD;


    print_r('$code: ');
    print_r($code);

    $header = ['Content-type: application/x-www-form-urlencoded'];
    $requestDataList = [
        'grant_type' => 'authorization_code',
        'client_id' => '45a3349c334f34cf39fe9eb05fd70fe1',
        'redirect_uri' => $isProd ? KAKAO_TOKEN_CALLBACK_URL_PROD : KAKAO_TOKEN_CALLBACK_URL_DEV,
        'code' => $code,
        'client_secret' => 'eKBVEjT6XScKuKwXUzmDdKPubfdpORhW',
    ];

    $postFields = json_encode($requestDataList);
    $tokenResponse = $restfulApi->callPost(KAKAO_TOKEN_URL, $postFields, $header);

    print_r('$tokenResponse: ');
    print_r($tokenResponse);

    if ($tokenResponse->httpCode !== 302)
    {
        echo json_encode([
            'result' => FALSE,
            'code' => $tokenResponse->output->error,
            'message' => $tokenResponse->output->error_description,
        ]);

        exit();
    }

    return $tokenResponse->output;
}

php 코드 공유드립니다.
인가 코드 받기 api에 redirect_uri로 전달되는 곳이며, 인가코드로 토큰 발급 요청 api 를 호출하는 코드입니다.

안녕하세요.

토큰 발급은 x-www-form-urlencoded 데이터 형식으로 요청 하셔야 합니다.

curl_setopt($ch, CURLOPT_URL, 'https://kauth.kakao.com/oauth/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=authorization_code'
                    . '&client_id=' . $cliend_id
                    . '&redirect_uri=' . urlencode($redirect_uri)
                    . '&code=' . $code);

해결되었습니다. 감사합니다 :slight_smile: