예제 #1
0
        public ActionResult <TestModel01> Test01(int nData, string sData)
        {
            //리턴 보조
            ApiResultReady rrResult = new ApiResultReady(this);
            //리턴용 모델
            TestModel01 armResult = new TestModel01();

            rrResult.ResultObject = armResult;

            if (0 <= nData)
            {//양수다.
                armResult.nTest = nData;
                armResult.sTest = sData;
            }

            if (false == rrResult.IsSuccess())
            {
                rrResult.InfoCode = "1";
                rrResult.Message  = "'nData'에 음수가 입력되었습니다.";
            }

            return(rrResult.ToResult(armResult));
        }
예제 #2
0
        public ActionResult <SignInResultModel> RefreshToAccess(
            [FromForm] string sRefreshToken)
        {
            //결과용
            ApiResultReady rrResult = new ApiResultReady(this);
            //엑세스 토큰 갱신용 모델
            SignInResultModel rmResult = new SignInResultModel();

            rrResult.ResultObject = rmResult;

            //API 호출 시간
            DateTime dtNow = DateTime.Now;

            //리플레시 토큰 갱신 시도 기록
            GlobalSign.LogAdd_DB(
                1
                , ModelDB.UserSignLogType.RefreshToken
                , 0
                , string.Format("RefreshToAccess 시도 : {0}", sRefreshToken));


            //토큰 갱신 요청
            TokenResponse tr = GlobalStatic.TokenProc.RefreshTokenAsync(sRefreshToken).Result;

            //기존 로그인한 유저 검색
            UserSignIn itemUSI = null;


            if (true == tr.IsError)
            {//토큰 갱신 실패
                //DB에 있는 리플레시 토큰은 수동으로 확인해서 갱신해준다.
                //토큰 정보는 메모리에 저장되기 때문에 서버가 내려갔다 올라오면 토큰정보가 날아간다.
                //이런 예외를 처리하기위해 수동으로 리플레시 토큰을 갱신해야한다.
                using (SpaNetCoreFoundationContext db1 = new SpaNetCoreFoundationContext())
                {
                    //기존 로그인한 유저 검색
                    itemUSI
                        = db1.UserSignIn
                          .Where(m => m.RefreshToken == sRefreshToken)
                          .FirstOrDefault();

                    if (null == itemUSI)
                    {//정보 자체가 없다.
                        rrResult.InfoCode = "-101";
                        rrResult.Message  = "갱신실패 : 인증 정보가 없습니다.";
                    }
                    else if (dtNow > itemUSI.RefreshDate)
                    {//인증정보의 유효기간이 지났다.
                        rrResult.InfoCode = "-102";
                        rrResult.Message  = "갱신실패 : 인증가능 기간이 지났습니다.";
                    }
                    else
                    {//토큰이 살아있다.
                        //유저를 검색한다.
                        User findUser
                            = db1.User
                              .Where(w => w.idUser == itemUSI.idUser)
                              .FirstOrDefault();

                        //토큰을 갱신한다.
                        tr
                            = GlobalStatic.TokenProc
                              .RequestTokenAsync(findUser.SignEmail, findUser.Password)
                              .Result;
                    }
                } //end using db1
            }     //end if (true == tr.IsError)


            if (true == rrResult.IsSuccess())
            {
                if (true == tr.IsError)
                {
                    rrResult.InfoCode = "1";
                    rrResult.Message  = "토큰 갱신에 실패하였습니다.";
                }
            }


            if (true == rrResult.IsSuccess())
            {//에러가 없다.
                //유저 정보를 받는다.
                UserInfoResponse inrUser
                    = GlobalStatic.TokenProc.UserInfoAsync(tr.AccessToken).Result;

                //유저 정보 추출
                ClaimModel cm = new ClaimModel(inrUser.Claims);

                using (SpaNetCoreFoundationContext db1 = new SpaNetCoreFoundationContext())
                {
                    //기존 로그인한 유저 검색
                    itemUSI
                        = db1.UserSignIn
                          .Where(m => m.idUser == cm.id_int)
                          .FirstOrDefault();

                    if (null == itemUSI)
                    {//기존 로그인 정보가 없다,
                        //이러면 강제로 토큰이 상실된 것일 수 있다.
                        rrResult.InfoCode = "1";
                        rrResult.Message  = "토큰 갱신에 실패하였습니다.";
                    }
                    else
                    {
                        //로그인 되어있는 유저정보 수정
                        itemUSI.RefreshToken = tr.RefreshToken;
                        itemUSI.RefreshDate  = dtNow.AddDays(30);

                        //db 적용
                        db1.SaveChanges();


                        //유저에게 전달할 정보 만들기
                        rmResult.idUser   = cm.id_int;
                        rmResult.Email    = cm.email;
                        rmResult.ViewName = rmResult.Email;

                        rmResult.access_token  = tr.AccessToken;
                        rmResult.refresh_token = tr.RefreshToken;


                        //기록
                        GlobalSign.LogAdd_DB(
                            1
                            , ModelDB.UserSignLogType.RefreshToken
                            , cm.id_int
                            , string.Format("RefreshToAccess 성공 : {0}", rmResult.Email));
                    }
                }//end using db1
            }

            return(rrResult.ToResult(rmResult));
        }