자바 SpringBoot 는 Identity Server 4 를 인증 서버 학습 노트 로 어떻게 사용 합 니까?

20834 단어 자바uipostman
Identity Server 4 를 자바 SpringBoot 의 인증 서버 와 영패 발급 서버 로 사용 하 는 방법 을 기록 합 니 다.본인 도 초보 이 니 이해 가 부족 한 부분 은 잘 부탁드립니다.또 중국 어 를 쓰 지 않 은 지 정말 오래 되 었 기 때문에 단어 사용 이 적절 하지 않 은 곳 에서 도 초보 사내 동료 들 이 함께 발전 했다 고 지적 하 는 것 을 환영한다.또한 이 영패 의 획득 은 수 동 으로 postman 을 사용 하여 영패 점 에 따라 가 져 온 다음 요청 머리 에 postman 을 통 해 자바 에 게 보 내 는 demo 를 사용 해 야 합 니 다.이 demo 는 영패 의 기능 을 가 져 오지 않 았 습 니 다.주의 하 시기 바 랍 니 다.
배경 지식:JWT 란 무엇 인가첫 번 째 부분:Identity Server 4 의 서버 구축두 번 째 부분:자바 SpringBoot 프레임 워 크 와 IDS 4 의 결합SpringBoot 데모 소스 코드:https://github.com/Danni-Ke/SpringBootDemo
1.Jwt 란 무엇 인가?
Jwt 가 무엇 인지,안에 있 는 매개 변수 가 무엇 인지 에 대해 서 는 아래 링크 를 참고 하여 알 아 볼 수 있 습 니 다.
https://www.cnblogs.com/zjutzz/p/5790180.html
아래 의 이 링크 는 전체 영어 이지 만 jwt 가 무엇 인지 에 대해 비교적 상세 하고 영어 가 좋 은 학생 은 올 라 갈 수 있 습 니 다.
https://tools.ietf.org/html/rfc7519
이 링크 는 주로 jwt 와 reference token 이 다르다 고 말 했 습 니 다.정말 중요 합 니 다.그 중에서 도 틀린 말 이 있어 서 저 는 함정 에 빠 졌 습 니 다.
https://www.cnblogs.com/Irving/articles/9357539.html
 
2.Identity 서버 인증&영패 발급 서버 준비
Identity Server 4 를 어떻게 구축 하고 사용 하 는 지 에 대해 인터넷 에 너무 많은 튜 토리 얼 이 있 습 니 다.여기 서 저 는 다른 설명 을 많이 하지 않 겠 습 니 다.저도 초보 이기 때 문 입 니 다.하지만 저 는 현재 UI 인터페이스 가 있 는 Identity Server 4 와 Identity(사용자 가 관리 하 는 부분)가 결 합 된 서버 를 사용 하고 있 습 니 다.많은 것들 이 구축 되 었 습 니 다.초보 자 에 게 매우 우호 적 이 고 탐색 절 차 를 줄 였 습 니 다.그러나 초보 자가 직접 사용 하 는 것 을 권장 하지 않 습 니 다.자신 이 Identity Server 를 구축 한 후에 Identity Sevrer 4 의 일부 매개 변수 에 대해 잘 이해 하지 못 하 는 부분 이 있어 서 더 이해 할 수 있 습 니 다.다음은 Identity Server 4 UI 의 github 소스 링크 입 니 다.
https://github.com/skoruba/IdentityServer4.Admin
4.567917.이 Identity Server 4 UI 설정 에 관심 이 있 는 사람 이 있 으 면 후기 에 도 상대 적 인 이 일 을 어떻게 만 들 었 는 지 기록 할 것 이다.이 Identity Server 에 API,Client,그리고 사용자 자원 을 설정 한 후에 저 희 는 다음 과 같은 단점 을 사용 할 것 입 니 다
  • http://x.x.x.x:5000/connect/token   토 큰 을 요청 하 는 포트 는 클 라 이언 트 id,클 라 이언 트 secret,사용자 이름,사용자 비밀번호,그리고 권한 수여 방식 을 제공 해 야 합 니 다.여기 서 제 가 선택 한 granttype 은 password 입 니 다
  • http://x.x.x.x:5000/connect/introspect  영패 자성 점,많은 국내 설 은 refenrece token 에 사용 되 고 많은 사내 들 이 번역 한 공식 문 서 는 근본적으로 진지 하 게 번역 하지 않 았 다(실제 뜻 도 모 를 것 으로 예상 된다).이 점 은 실제 적 으로 해당 하 는 가방 이나 library 가 jwt 토 큰 을 분석 하 는 프로그램 에서 토 큰 의 합 법성 을 검증 하 는 데 사용 할 수 있 습 니 다.다만 여기 서 유일 하 게 다른 것 은 renfence token 과 jwt token 이 이 점 을 보 내 려 는 매개 변 수 는 다르다 는 것 입 니 다.reference 에 대해 보 낼 것 은 client 입 니 다.id 와 secret.하지만 jwt token 에 대해 서 는 base 64 인 코딩 을 요청 머리 에 보 내 는 Api 입 니 다.name 과 Api시 크 릿,여기 가 바로 Api 에 시 크 릿 이라는 인자 가 있 는 이유 이지 만 우 리 는 거의 사용 하지 않 았 다
  • http://x.x.x.x:5000/.well-known/openid-configuration/jwks(공개 키 개방 점)는 jwt 토 큰 을 분석 하 는 공개 키 개방 점 을 가 져 오 는 데 사 용 됩 니 다

  •  
    3.Java SpringBoot
    새로운 프로젝트 를 어떻게 시작 하 는 지 에 대해 서 는 더 이상 말 하지 않 겠 습 니 다.인터넷 튜 토리 얼 이 많 습 니 다.우 리 는 바로 주제 에 들 어 갑 니 다.여기 제 가 사용 하 는 Intellij IDEA 입 니 다.그리고 필 터 를 등록 한 다음 에 여기 서 jwt 를 검증 하 는 두 가지 방법 을 제공 합 니 다.
    4.567917.자성 단점 을 통 해 검증 결 과 를 되 돌려 주 고 사용http://x.x.x.x:5000/connect/introspect 
  • 공개 키 를 통 해 터미널 로 컬 분석 token 을 개방 하고 사용 합 니 다.http://x.x.x.x:5000/.well-known/openid-configuration/jwks

  • 클 라 이언 트 가 없 기 때문에 여 기 는 token 대신 post man 을 사용 합 니 다.http://x.x.x.x:5000/connect/token그리고 자바 프로그램 에 요청 합 니 다.
    3.1 자성 단점 을 통 해 검증 결 과 를 되 돌려 준다.
    이것 은 매우 간단 합 니 다.위의 코드 는 주로 Filter 안의 dofiler 부분 입 니 다.
    @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("        ,            token");
            boolean authenticated = false;
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse rep = (HttpServletResponse) servletResponse;
    
            //--------------         -------------------------------
            //--------------      ----------------------------------------
            //    url          ,getHeader()             
            //      ,      token keyname   ,           
            //   header    token     ,   
            boolean authorizationHeaderExist = req.getHeader("Authorization") != null;
            if (!authorizationHeaderExist) {
                rep.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                return;
            }
    
            String token = cutToken(req.getHeader("Authorization"));
            //      ApiSecret ApiName, application.propertiesz 
            String apiNameSecret = "Basic " + ApiNameSecretbase64();
            //
            String introspectEndpoint = "http://localhost:5000/connect/introspect";
    
    
            //-------------    ----------------------------------------------
            //protected HttpClient client = new DefaultHttpClient();   
            HttpClient client = HttpClientBuilder.create().build();
            HttpPost post = new HttpPost(introspectEndpoint);
            //     
            post.setHeader("Authorization", apiNameSecret);
            //      (body)
            List urlBodys = new ArrayList();
            urlBodys.add(new BasicNameValuePair("token", token));
            post.setEntity(new UrlEncodedFormEntity((urlBodys)));
            HttpResponse response = client.execute(post);
    
            System.out.println("
    Sending 'POST' request to URL : " + introspectEndpoint); System.out.println("Post parameters : " + post.getEntity()); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); // reponse content , BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); // StringBuffer String StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); } // , content System.out.println(result.toString()); //------------------------------- authenticated --------------------------- JSONObject jo = new JSONObject(result.toString()); Boolean active = jo.getBoolean("active"); if (response.getStatusLine().getStatusCode() == 200&& active==true) { String role = jo.getString("role"); authenticated = true; } //-------------------------------- authenticated , 401----------- if (authenticated) { // , url filterChain.doFilter(servletRequest, servletResponse); } else { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } } // Api secret , public String ApiNameSecretbase64() { String result = api.getapiName()+":"+api.getapiSecret(); byte[] data=Base64.encodeBase64(result.getBytes()); return new String(data); } // token , Bearer public String cutToken(String originToken) { String[] temp = originToken.split(" "); return temp[1]; }

    위의 ApiNameSecretbase64 설정 에 있 는 정 보 를 읽 고 인 코딩 된 Api Name 과 Secret 를 되 돌려 주 는 기능 입 니 다. 다음은 제 application.properties 와 관련 된 설정 입 니 다.이 설정 들 은 Identity Server 에 넣 어야 합 니 다.메모리 방식 으로 도 저 처럼 UI 관리 인터페이스 를 사용 하여 직접 추가 할 수 있 습 니 다.
    #IdentityServer4       
    api.name = Api1
    api.secret=secreta

    자바 프로젝트 와 Identity Server 4 를 동시에 시작 하면 결 과 를 볼 수 있 습 니 다.token 을 가 져 오지 않 으 면 권한 이 없습니다.여 기 는 potman 의 결 과 를 놓 지 않 습 니 다.이 편 은 주로 코드 에 중심 을 두 기 때 문 입 니 다.이 점 을 요청 하 는 효과 에 대해 서 는 공식 문 서 를 참고 하여 로 컬 에 해당 하 는 답장 기반 인증 방식 을 만 들 수 있 습 니 다.내 쪽 에 서 는 이 영패 가 합 법 적 인지 확인 하기 위해 서 안에 있 는 active 라 는 불 량 을 직접 추출 했다.
     
    3.2 공개 키 로 컬 분석 요청 을 통 해 인증 token 으로 되 돌아 가기
    잔말 말고 코드 부터 올 려.
     @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
        {
            System.out.println("        ,      jwk      token");
            boolean authenticated = false;
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse rep = (HttpServletResponse) servletResponse;
            boolean authorizationHeaderExist = req.getHeader("Authorization") != null;
            if (!authorizationHeaderExist) {
                rep.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                return;
            }
            String jwkEndpoint = "http://localhost:5000/.well-known/openid-configuration/jwks";
            //String token = cutToken(((HttpServletRequest) servletRequest).getHeader("Authorization"));
            String token = cutToken(req.getHeader("Authorization"));
    
    
            //------------  ------------------------------------------------------
            //com.nimbusds JWT   ,            ,
            //https://connect2id.com/products/nimbus-jose-jwt/examples/validating-jwt-access-tokens
            //        
            ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor();
            //         
            JWKSource keySource = new RemoteJWKSet(new URL(jwkEndpoint));
            //      ,       ,            ,   RSA256  
            JWSAlgorithm expectedJWSAlg = JWSAlgorithm.RS256;
            //   RSA                  
            JWSKeySelector keySelector = new JWSVerificationKeySelector(expectedJWSAlg, keySource);
            if(keySelector==null)
            {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                System.out.println("      。");
                return;
            }
            //              
            jwtProcessor.setJWSKeySelector(keySelector);
            //     token(  ),       
            SecurityContext ctx = null;
            JWTClaimsSet claimsSet = null;
            try {
                claimsSet = jwtProcessor.process(token, ctx);
                authenticated = true;
            } catch (ParseException e) {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                e.printStackTrace();
                return;
            } catch (BadJOSEException e) {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                e.printStackTrace();
                return;
            } catch (JOSEException e) {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                e.printStackTrace();
                return;
            }
            //
            System.out.println(claimsSet.toJSONObject());
            //       
            if(claimsSet==null) {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }
            //        ,    ,       ,    
            JSONObject jo = new JSONObject(claimsSet.toJSONObject());
            String role = jo.getString("role");
            //      token,          
            //--------------------------------  authenticated  ,      401-----------
            if (authenticated)
            {
                //      ,          url      
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }
        }
    
    
        //   
        public String cutToken(String originToken)
        {
            String[] temp = originToken.split(" ");
            return temp[1];
        }

    여 기 는 주로 가방 을 사 용 했 습 니 다.용법 은 다음 과 같 습 니 다.영어 가 좋 은 학생 들 은 이 링크 를 직접 연구 할 수 있 습 니 다.
    https://connect2id.com/products/nimbus-jose-jwt/examples/validating-jwt-access-tokens
    이 가방 은 import 가 필요 한 것 은 maven 이 다음 과 같이 의존 해 야 합 니 다.
     
        
            
            
                com.nimbusds
                nimbus-jose-jwt
                7.3
            
     
        

     

    import com.nimbusds.jose.*;
    import com.nimbusds.jose.jwk.source.*;
    import com.nimbusds.jwt.*;
    import com.nimbusds.jose.proc.JWSKeySelector;
    import com.nimbusds.jose.proc.JWSVerificationKeySelector;
    import com.nimbusds.jwt.proc.*;


     거의 이 렇 습 니 다.그리고 잘 모 르 는 곳 에서 소스 코드 를 직접 보 는 것 도 있 습 니 다.
    다음으로 전송:https://www.cnblogs.com/BeautifulBoy1301/p/11193488.html

    좋은 웹페이지 즐겨찾기