EEYatHo 앱 깎는 이야기

JPA, Swift ) Kakao 로그인 클라-서버 2중 인증 - EEYatHo iOS 본문

iOS, Swift/Feature

JPA, Swift ) Kakao 로그인 클라-서버 2중 인증 - EEYatHo iOS

EEYatHo 2021. 2. 27. 20:14
반응형

열심히 iOS + 서버개발 인턴 하는 중. 시니어 개발자분이 말씀하시길!

 

iOS에서 SNS 로그인으로 토큰을 받고, 서버에 넘겨주면,

서버는 받은 토큰으로 SNS 서버에 유효성을 검증한 뒤, ( + 프로필 정보를 새로 뽑은 뒤 )

'어 유효한 유저맞네~' 하고 우리가 관리하는 JWT Token을 넘겨주는게 국룰이라 하심.

 

이렇게 2중으로 인증하는 걸 구현 해야하는 SNS는 카카오, 구글, 애플 3종류...

ㅇㅋ 하믄되지..


[ 1. 카카오 ]

 

우선 카카오다.

카카오의 오픈 API를 이용하여 로그인 할 때,

핸들러로 oauthToken를 받아오는데, ( 변수명 from 카카오 문서 )

얘가 가진 accessToken을 이용하면 된다.

let serviceTerms = ["tag1", "tag2"]
AuthApi.shared.loginWithKakaoTalk(serviceTerms: serviceTerms) { oauthToken, error in // 카톡으로 로그인 실시
    // 에러 처리
    if let error = error {
       	print(error)
        return
    }
            
    // 로그인 리퀘스트 생성
    let signInRequest = SignInRequest(name: "[유저 이름]",
                                      accessToken: oauthToken?.accessToken ?? "",
                                      socialType: .kakao,
                                      uuid: "[UUID]")
    // 로그인 리퀘스트 발싸
    NetworkManager.singIn(request: signInRequest) { [weak self] result in
        self?.signInResultProcessor(request: signInRequest, result: result)
    }
}

iOS 측에서 accessToken을 서버에 보내는 코드다.

 

( name은 사실상 필요없다.

서버에서 유저의 프로필을 가져오고, 그 프로필 정보로 우리 서비스의 회원을 생성할 것인데,

애플은 서버에서 재확인시 이름을 얻을 수 없다.

그렇지만 애플을 따로 처리하기 보다는 리퀘스트 모델을 통일 시키는게 났다고 판단해서 넣은 상태다. )

 

( uuid는 여러 기기로 로그인하는 것을 방지하는 용도다. 마찬가지로 필요없다. )

 

이 accessToken을 받은 서버는, 이렇게 처리한다.

if (socialType.equals("kakao")) {
	// 카카오 accessToken -> 카카오 토큰 유효성 확인 및 프로필 정보 얻기
    // URI 준비
    URI url = URI.create("https://kapi.kakao.com/v2/user/me");
    HttpHeaders header = new HttpHeaders();
    header.add("Authorization", "Bearer " + accessToken);
    HttpEntity httpEntity = new HttpEntity(header);

	// Http Request 발싸
    RestTemplate restTemplate = new RestTemplate();
	ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);

    // Json 파싱
    JsonUtil jsonUtil = new JsonUtil();
    KakaoDTO kakaoDTO = jsonUtil.convert(response.getBody().toString(), KakaoDTO.class);
    return SocialDTO.builder()
    .name(kakaoDTO.getKakaoAccount().getProfile().getNickname())
    .email(kakaoDTO.getKakaoAccount().getEmail())
    .build();
} else if ( ... ) { ... }

 

간단하다.

https://kapi.kakao.com/v2/user/me 에다가,

헤더에 Authorization : Bearer [액세스 토큰] 을 넣어서 보내면,

유저정보를 다시 얻으면서 유효성을 검증할 수 있다.

추후엔 이때 얻은 유저정보를 가지고, 우리 서비스의 회원을 만든다.

 

구글과 애플은 다음글에.

Comments