티스토리 뷰
[1] 카카오 REST API 로그인
1 ) 코드 받기 Copy URL
카카오톡 로그인 기능은 일반적인 OAuth 인증의 과정을 거친다.
우선 로그인 버튼 클릭 시 코드를 받아와서 사용자 토큰을 얻을 준비를 해야한다.
[Request]
GET /oauth/authorize?client_id={app_key}&redirect_uri={redirect_uri}&response_type=code HTTP/1.1
Host: kauth.kakao.com
[Response]
HTTP/1.1 302 Found
Content-Length: 0
Location: {redirect_uri}?code={authorize_code}
카카오 OAuth 서버에서 크로스 도메인 요청을 허용하고 있지 않기 때문에, URL 링크로 바로 이동시키거나 URL로 Redirect 시켜서 코드를 받았다.
app_key는 앱 생성시 받은 REST API Key를 입력하면 되고, redirect_url은 기본정보에 입력한 리다이렉트 path를 입력한다.
GET 방식 요청 URL은 다음과 같다.
https://kauth.kakao.com/oauth/authorize?client_id= REST API 키 &redirect_uri=http://localhost:8080/kakaologin&response_type=code
로그인 버튼을 클릭했을때 위의 링크로 이동하면 아래의 카카오톡 로그인 화면이 뜬다.
카카오톡 계정/PASSWORD를 입력하면 URI의 Redirect Path로 리다이렉트되며 code를 반환한다.
컨트롤러에서 다음과 같이 코드를 얻을 수 있다.
2) 사용자 토큰 받기
코드를 얻은 다음, 이제부터 코드를 이용하여 실제로 API를 호출할 수 있는 사용자 토큰(Access Token, Refresh Token)을 받아 올 수 있다.
[Request]
POST /oauth/token HTTP/1.1
Host: kauth.kakao.com
키 | 설명 | 필수 |
---|---|---|
grant_type | authorization_code로 고정 | O |
client_id | 앱 생성시 발급 받은 REST API 키. | O |
redirect_uri | 코드가 리다이렉트 된 URI. 설정 > 일반 > 웹 > 사이트 도메인에서 설정한 각각의 도메인에 설정 > 일반 > 웹 > Redirect Path 를 붙인 URI. | O |
code | 위 코드 받기에서 발급 받은 인증된 코드. |
[Response]
응답 바디는 JSON 객체로 아래 값을 포함합니다.
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"token_type":"bearer",
"refresh_token":"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
"expires_in":43199,
"scope":"Basic_Profile"
}
요청 결과로 API를 호출할 때 사용하는 access_token과 해당 토큰의 만료 시간(초 단위), 또한 토큰을 갱신 할 수 있는 refresh_token을 받습니다.
사용자 토큰은 얻은 code를 이용해서 POST 방식으로 요청해야한다. 뷰에서 Ajax로 요청하거나 컨트롤러에서 요청하면 된다.
다음은 컨트롤러에서 요청하기 위한 함수이다.
public static JsonNode getAccessToken(String autorize_code){
final String RequestUrl = "https://kauth.kakao.com/oauth/token";
final List<NameValuePair> postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
postParams.add(new BasicNameValuePair("client_id", RestApiKey)); // REST API KEY
postParams.add(new BasicNameValuePair("redirect_uri", Redirect_URI)); // 리다이렉트 URI
postParams.add(new BasicNameValuePair("code", autorize_code)); // 로그인 과정중 얻은 code 값
final HttpClient client = HttpClientBuilder.create().build();
final HttpPost post = new HttpPost(RequestUrl);
JsonNode returnNode = null;
try {
post.setEntity(new UrlEncodedFormEntity(postParams));
final HttpResponse response = client.execute(post);
final int responseCode = response.getStatusLine().getStatusCode();
System.out.println("\nSending 'POST' request to URL : " + RequestUrl);
System.out.println("Post parameters : " + postParams);
System.out.println("Response Code : " + responseCode);
/JSON 형태 반환값 처리
ObjectMapper mapper = new ObjectMapper();
returnNode = mapper.readTree(response.getEntity().getContent());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// clear resources
}
return returnNode;
}
컨트롤러에서 JsonNode의 트리 형태로 토큰을 받아서 제대로 출력되는지 확인한다.
import org.codehaus.jackson.JsonNode;
JsonNode jsonToken = Kakao.getAccessToken(code);
System.out.println("JSON 반환 : " + jsonToken.get("access_token"));
'웹개발 > Spring Framework' 카테고리의 다른 글
[스프링(Spring)] 웹개발 카카오톡 로그인 REST API 구현 [3] (1) | 2016.11.10 |
---|---|
[스프링(Spring)] 웹개발 카카오톡 로그인 REST API 구현 [1] (0) | 2016.11.10 |
[스프링(Spring)] MVC 아키텍처 (0) | 2016.10.22 |
[이클립스] ROOT(/) 경로에서 실행하기 (0) | 2016.10.11 |
[스프링(Spring)] Mybatis 연동 (0) | 2016.10.08 |
- Total
- Today
- Yesterday
- 아이오닉
- 웹 소켓 프로토콜
- 한영 변환
- Routes
- npm
- Angular
- 아이오닉2
- git branch
- End-to-End testing
- ionic2
- NgForm
- git commit
- 폼 유효성 검사
- 번들링
- Grunt
- Webpack
- angular2
- paralles desktop
- jQuery
- Angular CLI
- 의존성 주입
- Facebook AccountKit
- typeScript
- 옵저버블
- Typescript 패키지
- phone number
- module exports
- Gulp
- password validation
- git merge
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |