rest api 로그인 로그아웃 구현

rest api 로그인 로그아웃 구현

QA

rest api 로그인 로그아웃 구현

본문

최근 질문을 많이 올리네요..  api작업이 처음이라..

답답한 마음에 구글링만으로 아래 소스까지 왔습니다...

프레임워크 없이 에디터플러스로 작업하다보니, 구글링 자료에도 한계가 있어

sir에 남겨봅니다..

 

로그인 구현을 해본 API 입니다.

앱에서 아이디 패스워드 정보가 오고 유효한 값이면 JSON으로 되돌려주고

그때 토큰을 발행해서 보내주는 부분인데.. ( 토큰 사용법을  잘 모르겠습니다..)

$secret_key = "YOUR_SECRET_KEY";
$issuer_claim = "THE_ISSUER"; // this can be the servername
$audience_claim = "THE_AUDIENCE";

1.어떤값을 넣어야하나요?  아무키나 넣어도 되는건가요?

2. 토큰정보가 맞지않을때나 앱에서 로그아웃했을때 처리는 어떤식으로 하나요?

   ( 로그아웃시 앱쪽에서 토큰정보를 날리는건가요? 아님 api쪽에서 토큰을 어찌어찌 하는건지..)

 

 

 


<?
header("Access-Control-Allow-Origin: *");
header("Content-Type: text/html; charset=UTF-8");
//header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
session_start();
require_once $_SERVER["DOCUMENT_ROOT"]."/jwt/src/BeforeValidException.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/jwt/src/ExpiredException.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/jwt/src/SignatureInvalidException.php";
require_once $_SERVER["DOCUMENT_ROOT"]."/jwt/src/JWT.php";
use \Firebase\JWT\JWT;

include "db_info.php";
$arr = explode("/", $_REQUEST['url']);
if( count($arr)>= 1) $category = $arr[0]; // 구분자.
if( count($arr)>= 2) $type = $arr[1];      // 중간 구분자.
if( count($arr)>= 3) $seq = $arr[2];      // 세번째 구분자.
$headers = getallheaders();
$accept = $headers['Accept'];                 // 리턴타입을 결정하기 위하여 사용됨.
$method = $_SERVER['REQUEST_METHOD']; // GET, POST, DELETE, PUT
 
 if( $method == "POST" && $category == "info"){   
  header("Content-Type:application/json");
  $inputJSON = file_get_contents('php://input');
  $input= json_decode( $inputJSON, TRUE ); //convert JSON into array
 
 // 로그인
 if($type == "login" ){  
 
        $mb_id  = $input['mb_id'];
        $mb_pw  = $input['mb_pw'];
        $device_id = $input['device_id'];
        check_login($mb_id, $mb_pw,$device_id);
    }
 }
 
 
 
 function check_login($mb_id, $mb_pw,$device_id){
 $query = "SELECT mb_no, mb_password, mb_id, mb_name, mb_datetime   from g5_member where mb_id = '$mb_id' ";
 $query = mysql_query($query);
 $num=mysql_num_rows($query);
 $row=mysql_fetch_array($query);
 $products_arr=array();
 $products_arr["records"]=array();
 if (!$row['mb_id'] ) {
  $product_item=array(
    "status" => '401'
   );
 }elseif ( sql_password($mb_pw) != $row['mb_password'] ) {
  $product_item=array(
    "status" => '400'
   );
 }else{
  
   $secret_key = "YOUR_SECRET_KEY";
   $issuer_claim = "THE_ISSUER"; // this can be the servername
   $audience_claim = "THE_AUDIENCE";
   $issuedat_claim = time(); // issued at
   $notbefore_claim = $issuedat_claim + 10; //not before in seconds
   $expire_claim = $issuedat_claim + 60; // expire time in seconds
   $token = array(
            "iss" => $issuer_claim,
            "aud" => $audience_claim,
            "iat" => $issuedat_claim,
            "nbf" => $notbefore_claim,
            "exp" => $expire_claim,
            "data" => array(
                "status" => '200',
                 "mb_id" => $row['mb_id'],
                "mb_name" => $row['mb_name'],
                "mb_datetime" => $row['mb_datetime']
   ));
   $jwt = JWT::encode($token, $secret_key);
   $product_item=array(
     "status" => '200',
     "jwt" => $jwt,
     "mb_id" => $row['mb_id'],
     "mb_name" => $row['mb_name'],
     "mb_datetime" => $row['mb_datetime']
    );
   // 디바이스ID update
   if($device_id){
     $sql = "update g5_member set 
         mb_1   = '$device_id'
      where mb_id   = '$row[mb_id]'
    ";
    $rs = mysql_query($sql);
   }
 }
 array_push($products_arr["records"], $product_item);
 echo json_encode($products_arr);
 }

이 질문에 댓글 쓰기 :

답변 2

1.어떤값을 넣어야하나요?  아무키나 넣어도 되는건가요?
=> 시크릿키는 아무거나 넣으셔도 되지만 https://www.jsonwebtoken.io/ 을 통해서 만드셔서 사용하시면 되구요.

=> 클레임은 참고 https://elfinlas.github.io/2018/08/12/whatisjwt-01/
 

2. 토큰정보가 맞지않을때나 앱에서 로그아웃했을때 처리는 어떤식으로 하나요?

   ( 로그아웃시 앱쪽에서 토큰정보를 날리는건가요? 아님 api쪽에서 토큰을 어찌어찌 하는건지..)

=> 로그인시 토큰정보를 서버에서 받아옵니다.

=> 서버로부터 받은 토큰을 스토리지에 저장하고 서버 요청시마다 Header에 같이 보내주면 됩니다.

=> 여기서 세션(토큰)이 만료된 경우 서버에서는 만료됬다고 실패했다고 리턴이 될거구요.
그때 스토리지에 토큰을 날리시면 됩니다.

시크릿 키를 알면 토큰을 만들어서 접속할 수가 있습니다.

 

토큰은 가능하면 최대한 모르는 값으로.. (발생기 같은 것을 사용해서..)

 

그리고 나머지는 참조 https://velopert.com/2389

답변 감사합니다.
토큰은  제가 일방적으로 랜덤화 시켜서 형태를 만들면 된다는거죠?
rand(), time() 등등 조합해서 암호화 해도 된다는 뜻으로 이해했습니다..

나머지 참조 링크는 토큰에 관한 내용이긴한데..
생성된 토큰을 어떻게 서버단에서 유지하며.. 로그아웃시 처리에 관한부분은
못찾았습니다..

답변을 작성하시기 전에 로그인 해주세요.
전체 4

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT