keycloak access token 발급받기2

뿌이·2022년 3월 11일
0

스프링 클라우드

목록 보기
26/32
post-thumbnail

response type json으로 세팅 하는법 블로그 참고해서 했다.
그리고 json 파싱했다.
파싱하는 방법은 해당 url참고함
일단

userController 추가한 부분 설명

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_tokenid_token이 필요하므로
buffer에서 꺼내서 access_token과 id_token이라는 문자에 저장하겠음!

그래서 출력해보면

매우 출력이 잘 되고 있음을 확인할 수 있다

그러면 이제 해야할 것은 decode 하기
일단 decode를 하게되면 이런식으로 될 것이라는것을 jwt.io 홈페이지를 통해 알 수 있음
id_token을 디코드 해보겠음

여기서는 preferred_username 이 user네임이므로 쓸만하겠군
access_token도 디코드 해보겠음

이런 정보들이 들어있다.
필요한 정보를 decode후에 빼보도록 하겠다.
화이팅!

userController 전체코드

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에 보여주고있다
      }
}
profile
기록이 쌓이면 지식이 된다.

0개의 댓글