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

참고프로젝트 jpa 메서드도 참고

https://github.com/codingspecialist/Springboot-Security-OAuth2.0-V2

 

codingspecialist/Springboot-Security-OAuth2.0-V2

Contribute to codingspecialist/Springboot-Security-OAuth2.0-V2 development by creating an account on GitHub.

github.com

 

oauth 세팅 유튜브

youtu.be/WACDTFroYNI

 

현재 프로젝트

https://github.com/jaybon1/springwork/tree/master/securityOAuthEx01

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

---------

 

이클립스 내에서 의존성 추가하기

 

--

 

 

OAuth2 Client 선택 추가

---

 

기존에 있는 서비스를 이용하면 DB를 이용해야 하기 때문에 카카오나 네이버 인증을 이용하기 어렵다

스프링에는 OAuth 서비스가 따로 있다

 

스프링 부트에서 구글 페이스북을 표준으로 하는 이유는 리턴하는 정보가 규격화 되어 있기 때문

이외의 회사들은 정보규칙이 다르고 코드 토큰 등의 구성 방식이 다를 수 있다

 

OAuth 구동 순서

더보기
             (요청)           
사용자 <---------> 서버
             (로그인페이지)

서버에서 인증하는 것이 아니라 구글 페이스북에 먼저 인증을 요청

사용자 ---------->   구글 페이스북 ( 로그인 )

구글 페북에서 인증되면 서버에 코드를 준다

구글 페이스북 -------> 서버 (코드를 준다)

서버는 코드를 이용해서 구글 페이스북 액세스 토큰을 요청한다 
토큰을 받으면 (권한을 받은 것)

서버 -------> 구글 페이스북   (토큰요청)

구글 페이스북 -------> 서버 (토큰을 준다)

액세스 토큰으로 스코프를 요청 할 수 있다

서버 -------> 구글 페이스북   (스코프요청)

구글 페이스북 -------> 서버 (사용자 정보 스코프를 준다)

 

https://github.com/codingspecialist/Springboot-Oauth2.0-Facebook-Google-Login-Session

 

codingspecialist/Springboot-Oauth2.0-Facebook-Google-Login-Session

Contribute to codingspecialist/Springboot-Oauth2.0-Facebook-Google-Login-Session development by creating an account on GitHub.

github.com

 

약속된 규칙 - 라이브러리를 사용하면 주소를 아래와 같이 맟춰 줘야한다

/oauth2/authorization/google

/oauth2/authorization/ 주소를 OAuth-Client가 낚아채서 분석한다

분석하여 구글쪽으로 던져서 구글로그인 화면을 사용자에게 보내준다

 

yml 파일에 중요한 정보가 있을 경우 암호화파일을 만들어서 인증서로 이용
또는 파일을 다른 디렉토리에 만들어서 깃헙에 업로드 안되도록 하여도 된다
또는 깃에서 해당파일을 이그노어 처리한다

oauth + 세션 연동하는 것이 중점

yml 파일은 하위라면 2칸 띄우기, 값넣을 때는 1칸 띄우기

  security:
    oauth2:
      client:
        registration:
          google:
            client-id: 클라이언트키
            client-secret: 비밀키
            scope:
            - email
            - profile #스코프는 회사마다 다르기 때문에 적음

 

SecurityConfig.java

둘다 쓸거면 

.oauth2Login() 
.loginPage("/login")

를 적지말고

OAuth로그인만 쓸거면

.formLogin() 
.loginPage("/login")
.loginProcessingUrl("/loginProc")
.defaultSuccessUrl("/") 

를 안적으면 됨

 

.formLogin() 은 기본적으로 UserDetails 서비스를 탄다

반대로

.oauth2Login()은 직접 커스텀해줘야한다

 

패키지 추가

 

DefaultOAuth2UserService를 상속

 

무조건 오버라이드 하나해야함 loadUser

 

OAuth2User 오오쓰로그인 
UserDetails 일반로그인

두개의 인증세션이 생기는데 둘 중 하나만 쓸 것

 

PrincipalDetails.java

타입을 맟추기 위해 OAuth2User를 임플리먼트

 

 

 

 

oAuth2User를 리턴하는 게아니라 principalDetails를 리턴하면 세션을 하나로 관리 가능하다

 

테스트를 위해 new 해본다

 

 

내 구글 서버의 프라이머리키

sub= 프로바이더아이디
name= 풀네임
given_name= 이름, family_name= 성씨,
picture= 사진
email= 이메일
email_verified= 확인
locale= 지역

 

[ROLE_USER, SCOPE_https://www.googleapis.com/auth/userinfo.email, SCOPE_https://www.googleapis.com/auth/userinfo.profile, SCOPE_openid]



등등이 보인다

 

일반로그인은 
    provider:
    prividerId:
가 있는 사람은 못하게 막는다

User{
    id: 자동증가값
    username: 프로바이더_프로바이더 아이디
    password: 임의의 문자열을 해시값으로 만들어 입력
    emaill: 스코프의 이메일
    provider: 프로바이더
    prividerId: 프로바이더 아이디
}

 

 

 

userRequestClientRegistration{
registrationId='google', 
clientId='클라이언트아이디', 
clientSecret='클라이언트 시크릿',
clientAuthenticationMethod=org.springframework.security.oauth2.core.ClientAuthenticationMethod@592d42e,
authorizationGrantType=org.springframework.security.oauth2.core.AuthorizationGrantType@5da5e9f3, 
redirectUriTemplate='{baseUrl}/{action}/oauth2/code/{registrationId}', 
scopes=[email, profile], providerDetails=org.springframework.security.oauth2.client.registration.ClientRegistration$ProviderDetails@11e8362c, 
clientName='Google'}

{action}은 현재 login이다

 

이제 할 일은 OAuth2User와 PrincipalDetails를 합치는것 

 

 

 

리턴을 위에서 만든 함수로 변경

 

oAuth2User 는 Map이라서 관리하기 힘들다 그래서 클래스를 따로 만들어줌

 

구글 프로바이더 아이디 = sub

페이스북 프로바이더 아이디 = id

 

제공자(구글 페북)가 응답해주는 속성값이 달라서 공통으로 만들어준다

Oauth하나만 할거면 만들 필요 없다

PrincipalOauth2UserService.java에서만 사용할 클래스

 

 

 

SecurityConfig.java 수정

 

이 서비스에 접근해서 이용할 경우가 있기 때문에 싱글톤으로 잡아준다

 

 

 

 

 

userRequest - 코드 토큰 유저정보 등 모든 정보

oAuth2User - 토큰을 통해 응답받은 회원정보

 

 

UserRepository.java

쿼리는 연습삼아 만들어봄

 

@Service를 등록해야 SecurityConfig.java에 autowired가 되기 때문에 등록

userRepository를 @Autowired 해준다

 

 

 

 

 

 

 

빨간줄이 뜬다

 

Jpa 파일을 열어보면 옵셔널타입이다

제네릭 안의 오브젝트가 널이거나 널이 아니거나 담을 수 있다

즉 Optional 이 널을 감싸고 있기 때문에 널포인트 익셉션를 피할 수 있을 것

isPresent()는 값이 있는지 확인하여 불린
get()은 값을 반환
orElse() 값이 없으면 기본값 (빈객체) 반환 / 있으면 그대로 반환
orElseThrow() 값이 없으면 익셉션 발생 / 있으면 그대로 반환

 

첫번째 방법

.get()은 isPresent()이후에 꼭 쓰자

 

1번 검색

 

없는 번호 검색

 

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

JPA에서는 옵셔널을 지향하자

----------

 

두번째 방법

new User()를 하든 원하는 값을 채우든 하면 된다

 

또는 화살표함수 (함수가 하나일 경우!)

 

 

 

 

X자리에 익셉션을 넣는다

 

 

또는 화살표 함수 (함수가 하나라서) + 어떤 익셉션이올지 모를경우

 

sb에 스크립트를 넣어서 이동시켜도됨

value에 값을 여러개 넣을 경우 중괄호로 묶자

 

---

 

비밀번호를 넣지 않음 (Oauth로그인)

 

 

일반로그인은 비밀번호가 암호화 되기 때문에 값을 넣지 않으면 로그인안되고

Oauth로그인은 비밀번호가 없더라도 알아서 로그인 된다

 

일반로그인시

 

Oauth 로그인시

 

 

PrincipalDetails.java

생성자 만들어줌

 

 

실행해보면

 

PrincipalDetails.java

이렇게 합쳐주지 않으면 세션이 2개가 저장된다

@AuthenticationPrincipal PrincipalDetails

 

 

+ Recent posts