React ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋Š” ํ•„์ž์˜ " React&Python์œผ๋กœ ์›น๊ฐœ๋ฐœ(๋งํฌ์„œ๋น„์Šค)" ์นดํ…Œ๊ณ ๋ฆฌ ๊ฐœ๋ฐœ์†Œ์Šค์—
์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
( ์†Œ์Šค ํด๋”๋Š” ์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ž˜ ์ฝ์–ด๋ณด๊ณ ,  git ์†Œ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. )


1. ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค

       โ–ถ๏ธŽ keycloak-js

       โ–ถ๏ธŽ @react-keycloak/web

 

์šฐ์„  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ํด๋”๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•˜๊ณ ,  ํ„ฐ๋ฏธ๋‚ ์„ ์—ด์–ด ~>linserver/client ์—์„œ react ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

 

#4. ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ๋ฐ ํ™˜๊ฒฝ์„ค์ •

 

#4. ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ๋ฐ ํ™˜๊ฒฝ์„ค์ •

1.1. ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ๋ฐ ํ™˜๊ฒฝ์„ค์ • ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋‚˜๋ˆ„๊ณ ์ž client / server๋กœ ๊ตฌ๋ถ„ ํ•œ๋‹ค. โŽฎํ”„๋กœ์ ํŠธ ํด๋” : linkserver/ |-------- client ( React ๊ตฌ์กฐ) |-------- server ( Python๊ตฌ

firstvalue.tistory.com

 

$ yarn add keycloak-js

$ yarn add @react-keycloak/web

2. React์— Keycloak ์„ค์ •

   โŒ˜ keyclaok.js ์œ„์น˜: linkservice/client/src/keycloak.js)

   ----------------------------------------------------------------------------------------------

keyclaok์„ค์ •์„ ์œ„ํ•ด์„œ keycloak.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

import Keycloak from "keycloak-js";

//์ด์ „ ํฌ์ŠคํŒ…์˜ Keycloak ์‚ฌ์šฉ์ž ์•„์ด๋””์™€ ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์•„๋ž˜ ์„ค์ •
const keycloak = new Keycloak({
    realm: 'aip',
    url: 'http://localhost:8080/',
    clientId: 'testClient',
});

// initOption ์ง€์ •
export const initOptions = {
    onLoad: 'login-required',
    checkLoginIframe: false,
  };

export const onKeycloakEvent = (event, error) => {
  // console.log('keycloak event ', event, error);
  switch (event) {
    case 'onAuthLogout':
      keycloak.logout();
      break;
    case 'onAuthRefreshError':
      keycloak.logout();
      break;
    case 'onAuthRefreshSuccess':
    //๊ฐœ๋ฐœ๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉ, ์‹ค์ œ ์šด์˜๊ณ„์—์„œ๋Š” ์ œ์™ธ
      console.log('auth token:  ' + keycloak.token);
      console.log('refresh token:  ' + keycloak.refreshToken);
      break;
    default:
      break;
  }
};

export default keycloak;


const keycloak = new Keycloak({
    realm: 'aip',
    url: 'http://localhost:8080/',
    clientId: 'testClient',
});

ํ•ด๋‹น ์„ค์ •์€ ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ keycloak ์˜ Client์—์„œ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ Action ํ•˜์œ„ ํ™”์‚ดํ‘œ๋ฅผ ํด๋ฆญํ•˜๋ฉด "Download adapter config ํ™”๋ฉด์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ( reaml, url, clientid ํ‚ค ๋ช…์นญ์ด ๋‹ค๋ฅด์ง€๋งŒ ๋ฌธ์ œ์—†๋‹ค. )

 

initOptions๊ณผ onKeycloakEvent๋Š” App.js์—์„œ ReactKeycloakProvider ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ์–ธํ•œ๋‹ค.

 

initOptions

keycloak ๋กœ๊ทธ์ธ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์„ค์ •์œผ๋กœ onLoad

  • login-required : ์‚ฌ์šฉ์ž๊ฐ€ Keycloak์— ๋กœ๊ทธ์ธํ•œ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œ. 
  • check-sso : ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ๊ฒฝ์šฐ์—๋งŒ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋‹ค์‹œ ๋ฆฌ๋””๋ ‰์…˜๋˜๊ณ  ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€.

์—ฌ๊ธฐ๋Š” App.js์— ReactKeycloakProvider ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ login-required ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  ( ์ฆ‰, ํŠน์ •ํŽ˜์ด์ง€ ์ด๋™์‹œ ๋กœ๊ทธ์ธ์ด ์•ˆ๋˜์–ด ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์ฒ˜๋ฆฌ )

 

onKeycloakEvent

keycloak event๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, Provider์— ์ง€์ •ํ•˜์—ฌ event์‹œ ๋งˆ๋‹ค ์ฒ˜๋ฆฌ ๋‚ด์šฉ์„ ์„ ์–ธํ•œ๋‹ค. ์œ„๋Š” default๊ฐ’์œผ๋กœ ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

3. PrivateRoute.js ์ƒ์„ฑ

   โŒ˜ PrivateRoute.js ์œ„์น˜: linkservice/client/src/PrivateRoute.js)

   ----------------------------------------------------------------------------------------------

Keycloak์— ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์ž Route๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑํ•œ๋‹ค.

import { useKeycloak } from "@react-keycloak/web";

const PrivateRoute = ({ children }) => {
  const { keycloak } = useKeycloak();

  //keycloak์— ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  const isLoggedIn = keycloak.authenticated;

  return isLoggedIn ? children : null;
};

export default PrivateRoute;

 

3. App.js ์— ReactKeyclaokProvider ์™€ PrivateRoute ๋ฐ˜์˜ 

   โŒ˜ App.js ์œ„์น˜: linkservice/client/src/App.js)

   ----------------------------------------------------------------------------------------------

๊ธฐ์กด App.js ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

import React from "react"
import { BrowserRouter, Route, Routes } from "react-router-dom"
import LinkMain from "./component/links"
import LinkCreateMain from "./component/links.create"
import ManagerHome from "./component/manager"
import MenuIcon from "./component/menu"
import LinksList from "./component/links.list"
import LinkEdit from "./component/links.edit"

//์•„๋ž˜ ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
import { ReactKeycloakProvider } from "@react-keycloak/web";
import keycloak , { initOptions, onKeycloakEvent } from "./keycloak";
import PrivateRoute from "./PrivateRoute";

function App() {
  return (

    // ๊ธฐ์กด BrowserRouter ๋ฐ–์— ReactKeycloakProvider๋ฅผ ์„ ์–ธํ•œ๋‹ค. 
    // initOptions์— ์˜ํ•ด์„œ http://localhost:3000 ์œผ๋กœ ์ ‘์†์‹œ keycloak ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™๋œ๋‹ค.
    <ReactKeycloakProvider authClient={keycloak} 
    initOptions={initOptions} onEvent={onKeycloakEvent}>

      <BrowserRouter>    
        <Routes>
          <Route exact path="/" element={<LinkMain />} />  

          {/* PrivateRoute๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์ด ๋œ ์ƒํƒœ์—์„œ๋งŒ ํŽ˜์ด์ง€ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฒ˜๋ฆฌ  */}
          <Route exact path="/create" element={<PrivateRoute> <LinkCreateMain /> </PrivateRoute>} />  
          <Route exact path="/manager" element={<PrivateRoute> <ManagerHome /> </PrivateRoute>} />  
          <Route exact path="/links/list" element={<PrivateRoute> <LinksList /> </PrivateRoute>} />  
          <Route exact path="/link/edit/:id" element={<PrivateRoute> <LinkEdit /> </PrivateRoute>} />  
        </Routes> 
        <MenuIcon />
      </BrowserRouter>

     </ReactKeycloakProvider>
  );
  
}
export default App;

๊ทธ๋Ÿผ http://localhost:3000 ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด Keycloak์˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ• ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ธฐ์กด์—(์ด์ „ ํฌ์ŠคํŠธ์—์„œ) ์ƒ์„ฑํ–ˆ๋˜ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ๋œ๋‹ค.

 

keycloak ๊ธฐ๋ณธ ๋กœ๊ทธ์ธํ™”๋ฉด

 

๋‹ค์ŒํŽธ์—๋Š” http://localhost:3000 ์ ‘๊ทผ์‹œ ๋ฐ”๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๊ณ ,

admin ๋ฒ„ํŠผ ํด๋ฆญ ํ˜น์€ ๋กœ๊ทธ์ธ ์•„์ด์ฝ˜์„ ํด๋ฆญ ํ• ๋•Œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ค๋„๋ก ์ˆ˜์ •ํ•ด๋ณด์ž.

 

+ Recent posts