oAuth2 로그인의 자세한 내용은 블로그에 포스팅하였습니다 https://blog.naver.com/qjawnswkd/222293370027
//spring security oauth2
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
//github api
implementation group: 'org.kohsuke', name: 'github-api', version: '1.125'
## OAuth2
spring:
security:
oauth2:
client:
registration:
github:
client-id: {클라이언트 id}
client-secret: {클라이언트 secret}
@Service
@RequiredArgsConstructor
public class CustomOAuth2MemberService implements OAuth2UserService{
private final MemberRepository memberRepository;
private final HttpSession session;
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
DefaultOAuth2UserService service = new DefaultOAuth2UserService();
OAuth2User oAuth2User = service.loadUser(userRequest);
Member member = saveOrUpdate(oAuth2User);
session.setAttribute("oAuthToken", userRequest.getAccessToken().getTokenValue());
return new DefaultOAuth2User(
Collections.singleton(new SimpleGrantedAuthority(member.getRole())),
oAuth2User.getAttributes(), "login");
//nameAttributeKey = Principal name에 저장됨
}
public Member saveOrUpdate(OAuth2User oAuth2User) {
Member oAuthMember = Member.builder()
.username(oAuth2User.getAttribute("login"))
.name(oAuth2User.getAttribute("name"))
.picture(oAuth2User.getAttribute("avatar_url"))
.role(MemberRole.USER)
.build();
Member member = memberRepository.findByUsername(oAuthMember.getUsername())
.map(entity -> entity.update(oAuthMember))
.orElse(oAuthMember);
return memberRepository.save(member);
}
}
//로그인시 얻어지는 accessToken 값과, 유저이름으로 Github api 접근
//GitHub를 통해 다양한 api 에 접근할 수 있다.
GitHub gitHub = new GitHubBuilder()
.withOAuthToken(session.getAttribute("oAuthToken").toString(), oAuth2User.getName()).build();
//accessToken 이용 안할시 1시간에 50번만 호출 가능하고 이용시에는 5000번까지 가능하다
GHUser user = gitHub.getUser(oAuth2User.getName());
//repo 이름으로 찾기 예시
GHRepository repository = user.getRepository("microservices-spring-cloud");
//아이디 로그인 없이 그냥 불러올수 있다 (1시간 50번 요청 제한)
GitHub git = new GitHubBuilder().build();
//로그인 안할시에는 repo 검색시 앞에 유저이름이 필수로 들어가야한다.
GHRepository repository = git.getRepository("BeomjunLee/microservices-spring-cloud");
//등등 다양한 Github api 를 불러올수 있다.
몇가지 예제를 적자면
GHUser 를 통해 다양한 api 요청 메서드에 접근할 수 있다.
특정 repo 에 접근해서 커밋과 전체 커밋 갯수를 확인할 수 있다.
특정 repo 의 기여자들 리스트와 커밋 현황을 확인할 수 있다.
외에 다양한 api 를 사용할 수 있다.