카카오싱크 퍼머링크 발급 안내

@tim.l
답변 감사합니다.

정리하자면
현재 타이어나라 사이트는 rest-api방식이 아니라 js sdk팝업 방식으로 구현돼있으니

js sdk팝업 방식으로 구현을하려면
https://www.tirenara.net/mn/login.do?kakao=y url로 접속하면(또는 나중에 퍼머링크 발급을 받고 스캔하면)
로그인버튼을 클릭하지 않고 위 url에 진입하자마자 동의창을 띄우고 동의를 받고
자동으로회원가입을 시키도록 구성되어야한다는 말씀이신가요?

아니면 첨부해주신 문서를 보고
https://kauth.kakao.com/oauth/authorize?client_id={REST-API KEY}&redirect_uri={리다이렉트URI}&response_type=code 해당 url에서 인가코드 받기 > 토큰 받기 > 사용자정보 받은 후 가입
하는 별도의 프로세스를 따로 개발해야하나요?

궁금한점은 제가 먼저 말한 js sdk방식으로 사용이 가능한지,
아니면 rest-api로 다시 개발을 해야하는지입니다.

감사합니다…

js sdk팝업 방식으로 구현을하려면
https://www.tirenara.net/mn/login.do?kakao=y url로 접속하면(또는 나중에 퍼머링크 발급을 받고 스캔하면)
로그인버튼을 클릭하지 않고 위 url에 진입하자마자 동의창을 띄우고 동의를 받고
자동으로회원가입을 시키도록 구성되어야한다는 말씀이신가요?

퍼머링크의 원본주소는 화면에 아무것도 없는 빈화면에 즉시 로그인되도록 안내 드리고 있어요.
js sdk팝업 방식으로 구현 하실꺼라면 별도 페이지 하나 만드시는게 좋을 것 같습니다.


아니면 첨부해주신 문서를 보고
카카오계정{REST-API KEY}&redirect_uri={리다이렉트URI}&response_type=code 해당 url에서 인가코드 받기 > 토큰 받기 > 사용자정보 받은 후 가입
하는 별도의 프로세스를 따로 개발해야하나요?
궁금한점은 제가 먼저 말한 js sdk방식으로 사용이 가능한지,
아니면 rest-api로 다시 개발을 해야하는지입니다.

두가지 방식 어떤 것을 사용하셔도 됩니다. 로그인 방식을 제약하지는 않습니다.

다만, 대부분의 사용자들은 rest-api 방식을 사용하시고
퍼머링크의 원본주소를 카카오 인가 요청 주소로 설정하여
js sdk팝업 방식처럼 별도페이지 접근하지 않고 즉시 동의창이 뜨도록 구현하십니다.

고객의 접근성과 개발 여건 고려하셔서 선택하시면 될 것 같습니다.
감사합니다.

https://devtalk.kakao.com/t/topic/117924/43?u=tirenarakorea

답변 감사합니다.

궁금한게 생겼는데
현재 https://www.tirenara.net/mn/login.do?kakao=y 여기 url을 새로 만들어서
로그인처리 하는 부분을 새로 만들었다고 가정했을 경우에

예전에 답변해주신 카카오싱크 퍼머링크 설명을 보면 아래와 같은데
어떤 앱으로 QR코드를 스캔하더라도,
카카오톡 클라이언트를 실행하고,
카카오톡 인웹뷰를 실행해, 여러분의 서비스 URL로 리다이렉트 해주는 역할을 합니다

지금은 로그인 창이 뜨지만 퍼머링크를 발급받는다면 로그인창이 안뜨고 위 설명과 같이 동작하나요?

어떤 앱으로 QR코드를 스캔하더라도,
카카오톡 클라이언트를 실행하고,
카카오톡 인웹뷰를 실행해, 여러분의 서비스 URL로 리다이렉트 해주는 역할을 합니다

네, 맞습니다.

(1) 퍼머링크는 호출받으면 카카오톡 인앱브라우저를 호출하고 브라우저 안에서 원본링크로 이동합니다.
(2) JS SDK 팝업방식은 일부 브라우저에서 카카오톡으로 로그인 못하고 로그인창으로 이동하지만,
퍼머링크가 카카오톡 인앱브라우저에서 해당 페이지를 띄우므로 로그인창 안뜨고 카카오톡으로 로그인하게됩니다.

@tim.l

감사합니다. 테스트해보니 ios에서 새창(window.open)으로 띄울 시 이슈가 있어서
팝업 로그인 방식은 사용을 못할 거 같은데

혹시 java로 된 rest api 샘플이 있을까요?

안녕하세요.

java로 구현된 간단한 예제입니다. 참고 부탁드려요~

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

안녕하세요 새로 구현을하는데…
인가코드를 받아와서 인가코드로 토큰을 받으려는 작업 진행중에
로컬에서 401 에러가 발생했습니다.

https://kauth.kakao.com/oauth/authorize?client_id=a0641350ab6b6afac7ba***&redirect_uri=http://test1.tirenara.net/test.do&response_type=code

위 주소로 받아온 code를 이용해 아래와 같이 요청을 했는데
{“grant_type”: “authorization_code”, “client_id”: “a0641350ab6b6afac7ba8fb30d11913f”, “redirect_uri”: “http://test1.tirenara.net/test.do”, “code”: “bcZqdzENRBSNdnMjFJ6Ki8d1uh6qBzb0f0mbpZHR2nH502kc2nBmzjJEfgcI7c4tinGjAwopcJ4AAAF9IqCduQ”}

15-Nov-2021 17:04:52.973 SEVERE [ajp-nio-8219-exec-364] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [action] in context with path [] threw exception
java.io.IOException: Server returned HTTP response code: 401 for URL: https://kauth.kakao.com/oauth/token

로컬에서 위와 같은 에러가 나서 @tim.l 님도 한번 보시라고 운영서버에 올렸는데 다른에러가 나더라고요.
그래서 포럼에서 검색해보니 @tim.l 님이 쓰신 글 중에
https://connect2id.com/blog/importing-ca-root-cert-into-jvm-trust-store
따라해보라는 댓글이 있어서 확인해보니
step2에서 pem > der 파일로만 변환이 가능할까요?

CA_GLOBALSIGN_ROOT_CA.crt
ChainFile_ALPHASSL_CA__SHA256__G2.crt
File_www.tirenara.net_apache.crt
KeyFile_www.tirenara.net_apache.key

발급받은 인증서 중에 pem 파일은 없어가지고요…
아니면 crt,key > pem 변환이 된다면
3,4번째 파일만 변환하면 되는건지 궁금합니다.

감사합니다.

(1) java.io.IOException: Server returned HTTP response code: 401 for URL: https://kauth.kakao.com/oauth/token

카카오측에 타이어나라 토큰 요청 로그가 없는걸 보면, Request데이터가 훼손 되었을 것 같습니다.
토큰 요청은 예제 코드 그대로 사용하셨나요?

(2) 운영서버에서 발생하는 자세한 에러 확인할 수 있을까요?

만약 인증서 문제인지 Java 버전과 ca-certificates 버전 확인이 필요합니다.

공지 : [긴급공지] 카카오 Open API 플랫폼 SSL 인증서 변경 안내 (수정됨, 재확인 필요) / [Urgent Notice] Replacing SSL certificates in Kakao Open API Platform (Revised, Need to recheck)


[ca-certificates 버전 확인 방법]
rpm -q ca-certificates
또는
yum list installed | grep ca-certificates


만약 버전이 공지한 것보다 낮고 업데이트 할 수 없다면
발급받으신 인증서가 아니라 루트 인증서를 설치하시면됩니다.

참고 : 루트 인증서 설치 방법 (JAVA API호출 환경)

안녕하세요

(1) java.io.IOException: Server returned HTTP response code: 401 for URL: https://kauth.kakao.com/oauth/token
카카오측에 타이어나라 토큰 요청 로그가 없는걸 보면, Request데이터가 훼손 되었을 것 같습니다.
토큰 요청은 예제 코드 그대로 사용하셨나요?

https://kauth.kakao.com/oauth/authorize?client_id=a0641350ab6b6afac7***&redirect_uri=http://test1.tirenara.net/test.do&response_type=code
② 6OF30GTcZ8ijfCBuLLNxEGjPbsCxMGVFYl0truLU5Ei7nXeYL7CFF6Ip1Eb34grJ1j0-aQopdSkAAAF9Ji-lrg
③ {“grant_type”: “authorization_code”, “client_id”: “a0641350ab6b6afac7ba8fb30d11913f”, “redirect_uri”: “http://test1.tirenara.net/test.do”, “code”: “6OF30GTcZ8ijfCBuLLNxEGjPbsCxMGVFYl0truLU5Ei7nXeYL7CFF6Ip1Eb34grJ1j0-aQopdSkAAAF9Ji-lrg”}

request데이터가 code밖에 없지 않나요? 개발서버에서 ①번에서 인가코드를 받고 ②번의 code를 가지고 다시 ③ 토큰을 요청했습니다.

혹시 모르니 소스도 올려보겠습니다.
String restApiKey = “a0641350ab6b6afac7ba8fb30d11913f”;
String code = params.getString(“code”);
String redirectUrl = request.getScheme() + “://” + request.getServerName() + “/test.do”;
System.out.println("################################## " + code);

		URL url = new URL("https://kauth.kakao.com/oauth/token");
		HttpURLConnection con = (HttpURLConnection) url.openConnection();
		con.setRequestMethod("POST");
		con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; utf-8");
		con.setRequestProperty("Accept", "application/json");
		con.setDoOutput(true);
		con.setRequestProperty("Authorization", restApiKey);

		String jsonInputString = "{\"grant_type\": \"authorization_code\", \"client_id\": \"" + restApiKey + "\", \"redirect_uri\": \"" + redirectUrl + "\", \"code\": \"" + code + "\"}";
		System.out.println(jsonInputString);
		try (OutputStream os = con.getOutputStream()) {
			byte[] input = jsonInputString.getBytes("utf-8");
			os.write(input, 0, input.length);
		}

		try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))) {
			StringBuilder response2 = new StringBuilder();
			String responseLine = null;
			while ((responseLine = br.readLine()) != null) {
				response2.append(responseLine.trim());
			}
			System.out.println(response2.toString());
		}

(2) 운영서버에서 발생하는 자세한 에러 확인할 수 있을까요?
자세한 에러는 아래 url에서 확인 가능합니다.

https://www.tirenara.net/test.do?code=SYN4ADON0X8yXvhtOnz32i9Ha8prlbsJehdFYbrz1pgbDjXm7Xu-QRRqoBnvseNtrBZ9nQorDNQAAAF9Ji5DEA

->자바 버전 확인
[root@autoonlineweb ~]# javac -version
javac 1.8.0_65

→ ca-certificates 버전 확인
[root@autoonlineweb ~]# rpm -q ca-certificates
ca-certificates-2015.2.6-65.0.1.el6_7.noarch

  1. 자바 버전이 낮은데 루트 인증서를 설치하면 될까요?

  2. 아니면 지금 방식에 rest api인데
    ios에서 생긴 이슈가 window.open 새창 문제가 있는거라…
    리다이렉트 방식으로 해봐도될까요?
    (확인해보니 redirect 방식으로 개발하려고해도 token받기가 필요하네요…)

안녕하세요.

ca-certificates 버전은 문제 없는 것 같고, JRE 1.8.0_101 이상 업데이트가 어려우시다면,


https://www.digicert.com/kb/digicert-root-certificates.htm
에서 DigiCert Global Root G2 인증서를 다운받아

아래 게시물 참고 하여 JRE폴더에 설치해주시면됩니다.
https://connect2id.com/blog/importing-ca-root-cert-into-jvm-trust-store


정상 설치 확인은 프로그램에서 API 호출하는 방식과 동일하게 아래 주소를 GET방식으로 호출하시고 OK응답오면 정상 설치된 것입니다.

https://test-kapi.kakao.com/test-ca-certificates

(설치후에도 여전히 안된다면, JRE폴더가 다른곳에 있는 경우니 찾아서 추가로 설치하시면됩니다.)

토큰 받기 는 인가코드(code)와 redirect_uri, 앱키(client_id), grant_type 이 파라메터로 전달되는데 ‘x-www-form-urlencoded’ 방식으로 전달되야합니다.

예제 참고해서 파라메터 처리부 확인 부탁드려요.

https://devtalk.kakao.com/t/topic/117924/56?u=tirenarakorea
이건 한번 설치해보겠습니다.

https://devtalk.kakao.com/t/topic/117924/57?u=tirenarakorea
이 건은 위에 제가 남긴 (https://devtalk.kakao.com/t/topic/117924/54?u=tirenarakorea) 댓글 보면
x-www-form-urlencoded 방식으로 호출하고있습니다…

음… 파라메터를 jsonInputString 현태로 보내시는 것 같아요.

String param = "grant_type=authorization_code&client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&client_secret="+CLIENT_SECRET+"&code="+code;

이런 형태로 구성하셔서 body data에 전달 하셔야합니다.

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

		String param = "grant_type=authorization_code&client_id="+REST_API_KEY+"&redirect_uri="+REDIRECT_URI+"&client_secret="+CLIENT_SECRET+"&code="+code;
		String rtn = httpCallService.Call(Const.POST, TOKEN_URI, Const.EMPTY, param);

	public String Call(String method, String reqURL, String header, String param) {
		String result = "";
		try {
			String response = "";
			URL url = new URL(reqURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod(method);
            conn.setRequestProperty("Authorization", header);
            if(param != null) {
            	System.out.println("param : " + param);
            	conn.setDoOutput(true);
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
                bw.write(param);
                bw.flush();            	
                
            }
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode);
            
            System.out.println("reqURL : " + reqURL);
            System.out.println("method : " + method);
            System.out.println("Authorization : " + header);            
			InputStream stream = conn.getErrorStream();
		    if (stream != null) {
			    try (Scanner scanner = new Scanner(stream)) {
			        scanner.useDelimiter("\\Z");
			        response = scanner.next();
			    }			
			    System.out.println("error response : " + response);
		    }
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line = "";
			while ((line = br.readLine()) != null) {
				result += line;
			}
			System.out.println("response body : " + result);
			
			br.close();
		} catch (IOException e) {
			return e.getMessage();
		}
		return result;
	}	

client_secret은 설정안해도 된다고하는데 빼도 상관없을까요?

네, 설정 안하셨다면 없어도됩니다~

빠른 답변 감사합니다.

Call 메소드 보면
위에서

String rtn = httpCallService.Call(Const.POST, TOKEN_URI, Const.EMPTY, param);
위와 같이 호출하던데
header는 null로 보내도 되나요?

그리고 혹시 정상적으로 호출이된다면 rtn에 어떤 값이 출력되나요?
지금은 html소스가 나오는데…

param : grant_type=authorization_code&client_id=a0641350ab6b6afac7ba8fb30d11913f&redirect_uri=http://test1.tirenara.net/test.do&code=GAR6-mwlIyAVNx503kEGOSYNLmhjKceu6tOUiG2u73PlV8LQxkT-NmiwieCv4C1qdM-usgo9cxgAAAF9K8tpUg
responseCode : 200
reqURL : https://kauth.kakao.com/oauth/authorize
method : POST
Authorization : null
response body : <!doctype html> Kakao Account @charset “UTF-8”;.old-style div[data-role=page]{display:none}.old-style div[data-role=page].km-page-active{display:block}.old-style div[data-role=modal]{display:none}.old-style .km-email-recommend{display:none;overflow-y:auto;z-index:100;width:438px;padding:10px 0;margin:0 30px;border:1px solid #b6b6b6;max-height:180px;border-radius…이하생략

Call메소드에서 println 출력 값입니다.

reqURL을 인가요청으로 잘못 기재하신듯해요. 토큰요청 주소로 설정해보시겠어요?

https://kauth.kakao.com/oauth/token

토큰요청은 헤더값을 가지고 하는게 없습니다. Content-Type정도 세팅해주시면되는데 request 가 맞다면 생략해도됩니다.

REST API | Kakao Developers REST API

안녕하세요

reqURL과 인증서 설치 완료했습니다.

https://www.tirenara.net/test.do
운영서버 위 url에서 테스트가 가능한데 정상 작동하는지 확인 좀 부탁드립니다.

그리고 최초 접속 시 로그인 유무 확인을 하는데 맞나요?

추가로

  1. 퍼머링크 발급 받은 후 qr 스캔
  2. 위 url 접속
  3. 해당 토큰으로 유저 정보 호출 (카카오)
  4. 호출 된 정보로 홈페이지 자동 가입 (타이어나라)

위 처럼 프로세스 진행되면 QR로그인 완성되는건가요?
빠진 거 있는지 확인 부탁드립니다

네, 접속해보니 토큰 정상 발급되었네요.
토큰으로 사용자 정보조회하여 회원가입 처리 해주시면 될 것 같습니다.

최초 접속 시 로그인 유무 확인을 하는데 맞나요?

네, 맞습니다. (퍼머링크 발급 시, 카카오 톡으로 인증하므로 따로 로그인은 필요 없습니다.)


위 처럼 프로세스 진행되면 QR로그인 완성되는건가요?

네, 맞습니다.
발급받은 퍼머링크로 QR코드 만드셔서 오프라인매장에 부착하시고
오프라인매장 방문자가 핸드폰으로 QR 스캔하면 기재해주신 순서로 가입하게됩니다.

감사합니다 그럼 퍼머링크는 언제 발급되나요?