Rest api 로그인 개념

javascript로 로그인 및 카카오스토리 쉐어에 대해 구현을 하다 사진자체를 업로드 하는 기능이 없어 REST api를 살펴보게 되었습니다.제가 만드는 앱은 pc용으로 브라우저를 내장하고 있기에 자바스크립트로 얻은 각종 정보들을 참조할 수 있습니다. 목적은 pc에서 로그인후 이미지를 업로드해 공유하는 것입니다. 질문을 몇가지 드려보겠습니다.

1, pc에서 카카오톡 로그인을 하는 방법은 자바스크립트로만 가능한걸로 판단됩니다. pc프로그램에서 자바스크립트로만 로그인이 가능한게 맞는지요?
2. 1번이 맞다면 로그인후 REST Api에서 억세스토큰등을 받아와서 작업을 진행하면 되는것인지요?
3. 어떠한 방법을 사용해서라도 pc프로그램에서 나의 카카오스토리에 이미지를 업로드해 공유가 가능한지요? 불가능 하다면 스마트폰으로만 개발가능한것인지 궁금합니다.

감사합니다.

@bkgoblin

REST api만으로 로그인 구현은 되나 페이지 이동이 발생하여 페이지 깜빡거림이 있어서 불편할 수 있지만 가능합니다.

redirect path로 authorization code를 받고 access token을 발급하는 API를 호출하시면 됩니다.

pc프로그램이라는 것이 PC용 웹브라우저라면 구현하실 수 있습니다.

번거롭게 여러번 질문드려 번번히 죄송합니다.
개발환경이 좀 특이해서 정확히 질문하는것도 어려운거 같습니다. 최대한 쉽게 말씀드려보겠습니다.
개발중인 프로그램은 윈도우용 어플리케이션입니다. .exe 인거죠 윈도우용 프로그램이요^^ 그 안에 인터넷브라우져를 내장시켰습니다. 해서 카카오톡 로그인 부분은 그 브라우져에서 rest api를 호출해서 정상적으로 진행하고 redirect_url로 code를 정상적으로 발급받았습니다. 그럼 엑세스토큰을 발급받아야 하는데 계속 웹브라우져를 사용할수 없으니 컴퍼넌트를 이용해 나머지 api들을 호출하고 있습니다.
여기서 드는 의문은 웹브라우저에서 생긴 세션은 유지되지 않는다는거죠 하지만 api들을 post로 호출을하려면 다른방법도 없어보입니다.극단적인 예로 code를 발급받으면 전혀 다른 환경에서 api를 호출해도 작동을 해야 하는게 맞는것인지요?
현제 는 401 Unauthorized 오류가 발생하고 있는데 같은 세션에서만 허용이 되는것인지 궁금합니다.
한가지 더 여쭤보자면, 왜~ 401 Unauthorized 오류가 나는지 확인은 불가능 할까요?
긴 질문 읽어주셔서 감사합니다.

@bkgoblin
authorization code를 발급받으셨다면 web service call로 token 받는 api를 호출하시면 access token / refresh token을 얻을 수 있습니다. 어딘가에 access/refresh token을 저장해 놓으면(db 같은 persistent한 저장소가 되겠지요) 그후 커스텀 웹브라우저가 생성/종료 된다 해도 필요한 때 가져다 쓰시고 만료가 되면 갱신해서 쓰시면 되지 않을까 싶습니다.
웹브라우저와 애플리케이션이 서로 연결될 포인트를 만들어야 합니다.

그럼 왜 401 오류가 나올까요… ㅠㅠ utf8로 전송을 했고 혹시나 하여 json, 일반text 등으로 바꾸어도 보았고 변수1=value1&변수2=value2 도 해보고 변수1=value1 변수2=value2 처럼도 해보고 보내볼수 있는방법은 다 시도해본거 같은데 어떤이유에서건 서버에서 code를 정확히 받지 못한거 같습니다. 로그를 한번 봐주실수는 없을까요?^^

@bkgoblin
토큰 발급 문제가 해결된 상태로 보이네요.

아닙니다~ㅠㅠ 너무 안되어서 php의 curl로 사용한거에요 ㅠㅠ

tom님의 답변을 솝꼽아 기다렸는데… ㅠㅠ 내일이나 확인가능하겠군요

@bkgoblin
저희도 개발하면서 틈틈히 보는 거라 답변 텀이 생길 때가 있네요.
php의 curl로 되셨으면 다른 것으로도 가능해야 맞는데요…
코드를 올려주시면 확인해 보겠습니다.

우선 바쁘신와중에 답변을 달아주시는점 매우 감사하게 생각하고 있습니다.
이제 몇번만 질문을 더 드리면 원인을 알 수 있을꺼 같습니다.
php 의 curl 에서
$url = ‘https://kauth.kakao.com/oauth/token’ . $params;
이런식으로 파라이터값을 url에 포함을 하고
curl_setopt($s, CURLOPT_POST, false);
이렇게 설정을 하면 정상적으로 값을 가져옵니다. 하지만

$url = ‘https://kauth.kakao.com/oauth/token’;
url을 url만 설정하고
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
포스트필드에 파라미터를 설정해서 보내면 401 에러가 나옵니다.

혹시 토큰을 얻어오는건 POST가 아니라 GET이 아닌지요?
url에 모든 파라미터를 통합했을때에만 정상작동 하는게 의아해서 드리는 질문입니다. 혹은 제가 뭔가 큰 착각을 하는것은 아닌지 의문이 들기도 하네요^^

@bkgoblin
POST로 전송시 CURLOPT_POST 옵션에 true를 적용하시고 보내신건가요?

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POST, true);로 수정하니 405 오류가 나옵니다

@bkgoblin
호출에 필요한 코드 전체를 알려주세요. 부분 부분으로 설명하시면 대답해드리기 힘듭니다.

정상작동

<?php //header('Content-Type: application/json; charset=utf-8'); $code = $_GET['code']; $CLIENT_ID = 'app_key'; $REDIRECT_URI = 'http://ttgapi.iwinv.net/oauth/oauth.php'; $params = sprintf('?grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s', $CLIENT_ID, $REDIRECT_URI, $code); $url = 'https://kauth.kakao.com/oauth/token' . $params; $s = curl_init(); curl_setopt($s, CURLOPT_URL, $url); curl_setopt($s, CURLOPT_POST, false); curl_setopt($s, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($s); $status_code = curl_getinfo($s, CURLINFO_HTTP_CODE); curl_close($s); echo '[status] ' . $status_code; print_r($result); ?>

비정상작동

<?php //header('Content-Type: application/json; charset=utf-8'); $code = $_GET['code']; $CLIENT_ID = 'app_key'; $REDIRECT_URI = 'http://ttgapi.iwinv.net/oauth/oauth.php'; $params = sprintf('?grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s', $CLIENT_ID, $REDIRECT_URI, $code); $url = 'https://kauth.kakao.com/oauth/token'; $s = curl_init(); curl_setopt($s, CURLOPT_URL, $url); curl_setopt($s, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($s, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($s); $status_code = curl_getinfo($s, CURLINFO_HTTP_CODE); curl_close($s); echo '[status] ' . $status_code; print_r($result); ?>

입니다.

$params = sprintf(’?grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s’, $CLIENT_ID, $REDIRECT_URI, $code);
에서 자이언트타입 앞의 ?를 제거하니 됩니다 죄송합니다.

이슈 종료는 말아주시고 제가 조금더 연구해보고 질문드리겠습니다.

개발중인 pc언어는 delphi2010이고 언어가 파스칼입니다. 많은 분들이 사용은 안하고 계시기에 델파이 소스를 올려 자문을 구하기도 여러울꺼 같아 일단 php의 curl로 구현하고 둘을 비교하기로 했습니다. 해서 지금까지 알려주신 정보를 토데로 코드를 생성해서 억세스토큰까지 발급을 받았습니다. 이후 앱연결을 하고 사용자 정보를 조회하려 하였으나 내용없이 무조건 400 오류가 납니다. 작성된 소스를 올려드리오니 보시고 도움을 주시면 대단히 감사하겠습니다.

<?php //header('Content-Type: application/json; charset=utf-8'); //코드생성 $code = $_GET['code']; $CLIENT_ID = '--'; $REDIRECT_URI = '--'; $params = sprintf('grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s', $CLIENT_ID, $REDIRECT_URI, $code); $url = 'https://kauth.kakao.com/oauth/token'; $s = curl_init(); curl_setopt($s, CURLOPT_URL, $url); curl_setopt($s, CURLOPT_POST, true); curl_setopt($s, CURLOPT_POSTFIELDS, $params); curl_setopt($s, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($s); $status_code = curl_getinfo($s, CURLINFO_HTTP_CODE); curl_close($s); $data_object = json_decode($result,true); //앱연결 $api_url = 'https://kapi.kakao.com/v1/user/signup'; $access_token = $data_object['access_token']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $access_token)); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo 'http code: ' . $http_code . "\n"; if (!$response) { echo 'no response'; exit; } print_r($response); //사용자 정보요청 $api_url = 'https://kapi.kakao.com/v1/user/me'; $access_token = $data_object['access_token']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $access_token)); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo 'http code: ' . $http_code . "\n"; if (!$response) { echo 'no response'; exit; } print_r($response); ?>

@bkgoblin
400 응답에 대한 body 정보를 확인해보세요.
그리고 에러 코드 참고하시면 도움이 될 듯 합니다.
사용자 정보 요청 개발 가이드 살펴보시고, header를 통해 access token을 잘 넘겼는지 확인해 보세요.

사용자 정보요청은 단순히 POST에서 GET으로 바꾸면 정상작동을 합니다. POST로 하는데 있어서 특별히 추가해줘야 할게 있는지요?

@bkgoblin
PHP 코드로 해서 POST로 전송 시 문제가 생긴건가요. 아니면 델파이에서 생긴 이슈인가요?
POST 전송 시 특별한 것은 없습니다. 일반적입니다.