자바 SpringBoot 는 Identity Server 4 를 인증 서버 학습 노트 로 어떻게 사용 합 니까?
배경 지식: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,그리고 사용자 자원 을 설정 한 후에 저 희 는 다음 과 같은 단점 을 사용 할 것 입 니 다
3.Java SpringBoot
새로운 프로젝트 를 어떻게 시작 하 는 지 에 대해 서 는 더 이상 말 하지 않 겠 습 니 다.인터넷 튜 토리 얼 이 많 습 니 다.우 리 는 바로 주제 에 들 어 갑 니 다.여기 제 가 사용 하 는 Intellij IDEA 입 니 다.그리고 필 터 를 등록 한 다음 에 여기 서 jwt 를 검증 하 는 두 가지 방법 을 제공 합 니 다.
4.567917.자성 단점 을 통 해 검증 결 과 를 되 돌려 주 고 사용http://x.x.x.x:5000/connect/introspect
클 라 이언 트 가 없 기 때문에 여 기 는 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.