response type json으로 세팅 하는법 블로그 참고해서 했다.
그리고 json 파싱했다.
파싱하는 방법은 해당 url참고함
일단
System.out.println("buffer 알려줘!!!!!!"+buffer);
//json파싱시작
JSONObject jObject = new JSONObject(buffer.toString());
String access_token= jObject.getString("access_token");
String id_token= jObject.getString("id_token");
System.out.println("access_token==============="+access_token);
System.out.println("id_token==============="+id_token);
buffer는
이런식으로 json 형태로 오게되어있다.
그러니까 json형태의 buffer를 json파싱 하겠다.
access_token
과 id_token
이 필요하므로
buffer에서 꺼내서 access_token과 id_token이라는 문자에 저장하겠음!
그래서 출력해보면
매우 출력이 잘 되고 있음을 확인할 수 있다
그러면 이제 해야할 것은 decode 하기
일단 decode를 하게되면 이런식으로 될 것이라는것을 jwt.io 홈페이지를 통해 알 수 있음
id_token을 디코드 해보겠음
여기서는 preferred_username
이 user네임이므로 쓸만하겠군
access_token도 디코드 해보겠음
이런 정보들이 들어있다.
필요한 정보를 decode후에 빼보도록 하겠다.
화이팅!
package com.dream.userservice.controller;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping(value="/", method = RequestMethod.GET)
public String home() {
System.out.println("controller stasrt");
return "index";
}
@GetMapping("/loanList")
public String loanList() {
return "loanList";
}
@GetMapping("/startup")
public String startup() {
return "startup";
}
@GetMapping("/info")
public String info(@Value("${server.port}") String port) {
return "User info페이지입니다 Port: {" + port + "}";
}
@GetMapping(path = "/service")//service로 접근하면 일단 무조건 로그인으로 보내줌
public void user_service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id_token = "";
String access_token = "";
System.out.println("들어와지나 userServiced입니다");
// if (id_token == null || id_token == "") {
// login(request, response);
// //response.sendRedirect("http://localhost:8480/login");
//
// }
//access_token 존재확인
if (access_token == null || id_token == "") {
login(request, response);
//response.sendRedirect("http://localhost:8480/login");
}
}
@GetMapping(path = "/login") //로그인에서는 keycloak으로 로그인하는데, token을 받을 수 있는 url로 보내줌
public void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//todo make keycloak login url
try {//redirect URL 알아보기
response.sendRedirect("http://localhost:8080/auth/realms/MSA/protocol/openid-connect/auth?
response_type=code&client_id=memberService&redirect_uri=http://localhost:64412/auth&scope=openid&nonce=asb3");
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
@GetMapping(path = "/auth") //로그인 성공시 받을 수 있는 url : keycloak에서 설정한 redirect url
public String auth(HttpServletRequest request, HttpServletResponse response,Model model)
throws ServletException, IOException {
//to do token save
String code = request.getParameter("code");
String query = "code=" + URLEncoder.encode(code,"UTF-8");
query += "&client_id=" + "memberService";
query += "&client_secret=" + "RePeZAfKZ9XFiFc2Z5LzzFstYeduPQSd";
query += "&redirect_uri=" + "http://localhost:64412/auth";
query += "&grant_type=authorization_code";
String tokenJson = getHttpConnection("http://localhost:8080/auth/realms/MSA/protocol/openid-connect/token", query);
return tokenJson;
}
private String getHttpConnection(String uri, String param)
throws ServletException, IOException {
URL url = new URL(uri);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Accept", "application/json"); //응답 형식 유형 설정
conn.setDoOutput(true); //콘텐츠를 보내는 데 연결이 사용되는지 확인
try (OutputStream stream = conn.getOutputStream()) {
try (BufferedWriter wd = new BufferedWriter(new OutputStreamWriter(stream))) {
wd.write(param);//param은 /auth에서 날린 parameter들
}
}
int responseCode = conn.getResponseCode();
System.out.println(responseCode);
String line;
StringBuffer buffer = new StringBuffer();
try (InputStream stream = conn.getInputStream()) {
try (BufferedReader rd = new BufferedReader(new InputStreamReader(stream))) {
while ((line = rd.readLine()) != null) {
buffer.append(line);
buffer.append('\r');
}
}
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("buffer 알려줘!!!!!!"+buffer);
//json파싱시작
JSONObject jObject = new JSONObject(buffer.toString());
String access_token= jObject.getString("access_token");
String id_token= jObject.getString("id_token");
System.out.println("access_token==============="+access_token);
System.out.println("id_token==============="+id_token);
return buffer.toString(); //buffer에 json형태를 다 문자열로 바꿔서 view에 보여주고있다
}
}