Search

82. 스프링부트 포토그램 OAuth2 페이스북 로그인 회원정보 받기

인증 코드를 받는 순간 포토그램 사이트에서는 ssar의 정보들을 가지고 와야한다 (ssar의 권한을 대행받음)
scope
-email
-public_profile
인증코드를 받고 (인증됨) Access Token 요청 (ssar의 정보에 접근할 수 있는 권한대행을 받음)
사용자 정보인 scope의 정보를 가지고 강제 회원가입 시킨 후에 로그인을 할거다
근데 OAuth2 를 쓰면 인증코드 안받아도 되고 Access Token도 안해도 된다.
바로 scope 정보를 받아서 진행하면됨
페이스북 로그인을 하면 정보를 페이스북으로 보내는거부터 시작해본다
근데 저번 시간에 application.yml에 oauth2 넣고 서버를 키면 오류가 났는데
시큐리티 설정을 안잡아줘서 그렇다.
SecurityConfig.java에서 configure 함수에 oauth2를 추가해준다
@Override protected void configure(HttpSecurity http) throws Exception { //super 삭제 - 기존 시큐리티가 가지고 있는 기능이 다 비활성화됨. http.csrf().disable(); //CSRF토큰을 비활성화 http.authorizeRequests() .antMatchers("/", "/user/**", "/image/**", "/subscribe/**" , "/comment/**", "/api/**").authenticated() // / , /user , /image, /subscribe, /comment로 시작하는 주소로 들어오면 인증필요 .anyRequest().permitAll() // 그게 아닌 모든 요청은 허용 하겠다. .and() .formLogin() //form태그 및 input태그 중에 form태그로 로그인할 .loginPage("/auth/signin") //접근 권한이 없는 페이지(위에 설정한 주소)들은 다 이 주소로 이동. //GET .loginProcessingUrl("/auth/signin") //POST -> 스프링 시큐리티가 로그인 프로세스 진행 .defaultSuccessUrl("/") //로그인을 정상처리하면 /로 이동 .and() .oauth2Login() // form 로그인도 하는데, oauth2 로그인도 할거야 .userInfoEndpoint() // oauth2로그인을 하면 최종응답을 회원정보를 바로 받을 수 있다 (인증코드 받고 AccessToken을 받아서 진행안하게 설정) .userService(null); }
Java
복사
config폴더에 oauth 폴더 생성 OAuth2DetailesService.java 생성
package com.cos.photogramstart.config.oauth; import org.springframework.stereotype.Service; @Service public class OAuth2DetailesService { }
Java
복사
SecurityConfig.java @RequiredArgsConstructor 등록 후
private final OAuth2DetailesService oAuth2DetailesService;
Java
복사
추가
근데 타입이 안맞아서 오류가 난다
그래서 타입을 맞추기 위해서 이렇게 잡아주면 오류가 안난다
@Service public class OAuth2DetailesService extends DefaultOAuth2UserService { }
Java
복사
이제 기본셋팅은 끝
1번부터 차근차근 진행할거다
signin.jsp 로 가서 페이스북 부분에 onclick 을 추가해줄거다
<!-- Oauth 소셜로그인 --> <div class="login__facebook"> <button onclick="javascript:location.href='/oauth2/authorization/facebook'"> <i class="fab fa-facebook-square"></i> <span>Facebook으로 로그인</span> </button> </div> <!-- Oauth 소셜로그인end -->
HTML
복사
뭔가 콘솔로그창에 무서운 경고와 함께 페이스북 로그인 화면으로 진입 성공
/oauth2/authorization/facebook
HTML
복사
근데 이 주소가 어디서 나왔냐면
들어가면
pom.xml에 해당 코드를 넣고
해당 예제는 github 로그인 예시인데 이렇게 참고해서 진행하라고 써져있다
OAuth2DetailesService 가서 loadUser치고 해당 함수를 클릭
@Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { System.out.println("OAuth2 서비스 탐 "); return super.loadUser(userRequest); }
Java
복사
2번의 응답까지 오는지 확인해볼거다
페이스북 로그인 진행 시 scope 설정창이 뜬다
해당 액세스 권한 수정 버튼을 클릭하면은
이메일주소를 선택할수있게 해놨다.
이메일을 선택안하면
scope에서 email값만 안오는거다
계속 진행 버튼 클릭하면은
오류 화면이 뜬다
OAuth2 서비스 탐 [2m2023-10-15 17:17:09.256[0;39m [31mERROR[0;39m [35m1514[0;39m [2m---[0;39m [2m[io-8080-exec-10][0;39m [36mo.a.c.c.C.[.[localhost].[/].[jsp] [0;39m [2m:[0;39m Servlet.service() for servlet [jsp] threw exception javax.el.PropertyNotFoundException: Property [user] not found on type [org.springframework.security.oauth2.core.user.DefaultOAuth2User] at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:254) ~[tomcat-embed-el-9.0.45.jar:3.0.FR] at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:206) ~[tomcat-embed-el-9.0.45.jar:3.0.FR] at javax.el.BeanELResolver.property(BeanELResolver.java:327) ~[tomcat-embed-el-9.0.45.jar:3.0.FR]
Java
복사
user라는 애를 못찾아서 오류로그가 찍혔다
이제 응답을 해주면서 loadUser함수가 실행된다
@Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { System.out.println("OAuth2 서비스 탐 "); OAuth2User oAuth2User = super.loadUser(userRequest); System.out.println(oAuth2User.getAttributes()); return null; //return super.loadUser(userRequest); }
Java
복사
다시 로그인 진행하면
오류화면 뜨는데 이건 return 을 null로 리턴해서 나는 오류라 신경안써도 된다
유저 정보값을 받아온다
이제 이 정보를 토대로 회원가입을 진행할거다

*참고