그램그램 - 카카오 로그인 추가

JIWOO YUN·2024년 5월 30일
0

GramGram

목록 보기
8/11
post-custom-banner

카카오 로그인 등록방법

  • kakao developer를 이용하여 앱을 등록하고 url 연결
  • 로그인 기능 활성화 -> oauth 리다이렉트 경로 설정 필요
  • Rest api 키가 생성되는게 이걸 가져와서 해당 프로젝트 yml파일에 설정으로 넣어준다.
    • cliendId에 해당 rest api키를 넣어줘야한다.
      • 단 rest api키는 노출되면 안되기 때문에 추가적으로 암호화작업을 해주던가 또는 yml 파일 분리 작업을 통해서 해당 중요한 데이터가 들어있는 내용은 안올라가게 ignore 진행 필요.

카카오 rest api를 yml에 등록하기 전에 해야할 일

Jasyspt를 사용하여 중요한 데이터들을 암호화하기 위해서 먼저 해당 설정을 먼저 jasypt를 추가하여 설정을 진행해준다.

  • Gradle에 추가
implementation group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.5'

jasypt config 추가

@Configuration
@EnableEncryptableProperties
public class JasyptConfigDES {

    @Value("${jasypt.encryptor.password}")
    private String encryptKey;


    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        config.setPassword(encryptKey);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        return encryptor;

    }
}
  • 문제 발생

    • jasypt 암호화 작업이 제대로 안되서 username을 인지 못하는 문제 발생.

    • 3.0.0 버전 부터 PBEWithMD5AndDESPBEWITHHMACSHA512ANDAES_256로 알고리즘 변경이 됨

    • PBEWithMD5AndDES 를 사용하려면 해당 부분을 바꿔줘야함.

    • config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");

이부분을 2시간여 정도 헤맸는데 여러 블로그를 뒤져보니 해답이 나오긴 했다. -> 꼭 문서를 제대로 확인하자.

  • 해당 암호 알고리즘을 사용할려는 이유는 해당 암호화를 해주는 사이트가 존재하다보니 이걸 활용해서 암호화작업을 하고 싶어서.

Oauth2.0 라이브러리 추가.

  • 리소스 서버에서 제공하는 자원에 대한 접근 권한을 위임 하는 방식.
    • 구글,카카오,네이버,페이스북등에서 제공하는 간편로그인 기능
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

카카오 rest api 문서에 필요한 데이터를 yml 에 등록한다.

  security:
    oauth2:
      client:
        registartion:
          kakao:
            clientId: ENC(CeUq2FUb7sCJtQ/UPCVqNKcZ1OHdIAE6zi9u99kVjZ7F8p5owXBJXQy3+KG6G/9r)
            scope:
              client-name: Kakao
              authorization-grant-type: authorization_code
              redirect-uri: http://localhost:8080/login/oauth2/code/kakao
              client-authentication-method: POST
            provider:
              kakao:
                authorization-uri: https://kauth.kakao.com/oauth/authorize
                token-uri: https://kauth.kakao.com/oauth/token
                user-info-uri: https://kapi.kakao.com/v2/user/me
                user-name-attribute: id

springSecurity에 oauthlogin 시도시 해당 위치 접근 허용

.oauth2Login(
        oauth2Login -> oauth2Login
                .loginPage("/member/login")
).

oauth로 처리된 데이터를 받아줄 UserServiceOauth 버전을 추가

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    private final MemberService memberService;

    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = super.loadUser(userRequest);

        String oauthId = oAuth2User.getName();

        String providerTypeCode = userRequest.getClientRegistration().getRegistrationId().toUpperCase();

        String username = providerTypeCode + "__%s".formatted(oauthId);

        Member member = memberService.whenSocialLogin(providerTypeCode, username).getData();

        return new CustomOAuth2User(member.getUsername(), member.getPassword(), member.getGrantedAuthorities());
    }

}

class CustomOAuth2User extends User implements OAuth2User {
    public CustomOAuth2User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
    }

    @Override
    public Map<String, Object> getAttributes() {
        return null;
    }

    @Override
    public String getName() {
        return getUsername();
    }
}
  • Oauth 경로로 들어오는 경우 유저가 해당 코드들로 처리되게 된다.
  • providerTypeCode
    • Oauth 로그인시 어디서 인증을 했는지 날라오기 때문에 어디서 인증했는지 분류하기 위해서 providerTypeCode 분리.
public RsData<Member> whenSocialLogin(String providerTypeCode, String username) {
    Optional<Member> findMember = findByUsername(username);

    if(findMember.isPresent()){
        return RsData.of("S-1","로그인 되었습니다.", findMember.get());
    }

    return join(providerTypeCode,username,"");
}
  • 이전에 같은 사람이 같은 소셜 로그인을 했는지 확인하는 코드
    • 소셜 로그인을 했었다면 그냥 그대로 로그인 했다고 넘겨주면되고, 아닌 경우 member에 해당 유저의 데이터를 멤버에 저장되게 진행해준다.

로그인 에러 발생

There was an unexpected error (type=Internal Server Error, status=500).
This class supports `client_secret_basic`, `client_secret_post`, and `none` by default. Client [kakao] is using [POST] instead. Please use a supported client authentication method, or use `setRequestEntityConverter` to supply an instance that supports [POST].
java.lang.IllegalArgumentException: This class supports `client_secret_basic`, `client_secret_post`, and `none` by default. Client [kakao] is using [POST] instead. Please use a supported client authentication method, or use `setRequestEntityConverter` to supply an instance that supports [POST].
  • 로그인 인증 과정 문제에 대해서 찾아보니 Spring Security 5.8 이상버전에서는

  • client-authentication-method: client_secret_post
    • 이렇게 바꿔줘야한다.

OAuth Migrations :: Spring Security

  • 문서를 찾아보니 post 는 client_secret_post로 대체되어있음.

암호화 방식 참고 블로그

: https://velog.io/@shdrnrhd113/Jaypt-%EB%A1%9C-yml-%ED%8C%8C%EC%9D%BC-%EC%95%94%ED%98%B8%ED%99%94-%ED%95%98%EA%B8%B0

oauth2 로그인 사용하기 :

https://deeplify.dev/back-end/spring/oauth2-social-login

해당 api 사용 방법 설명

: https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

profile
열심히하자
post-custom-banner

0개의 댓글