SWM-99-degree / jariBean

SWM 14th JariBean Project
0 stars 1 forks source link

[FEAT] Apple Social Login 구현 #162

Closed LineNo2 closed 1 year ago

LineNo2 commented 1 year ago

✏️ Description

Apple Social Login을 구현한다. 프론트 이슈를 참고한다.

🛠 Features

📖 Reference

LineNo2 commented 1 year ago

수정사항

기존 kakao처럼의 jaribean://의 콜백은 필요하지 않을 것 같습니다. 해당 핑퐁 과정은 스킵하고, 바로 code를 받아 검증하는 작업 후 로그인 처리 해주시면 될 것 같습니다.

LineNo2 commented 1 year ago

client_secret

다음의 형태로 작성하시면 됩니다.

Header

{
  "alg": "ES256",
  "typ": "JWT",
  "kid": "***"
}

Payload

{
  "iss": "***",
  "exp": 1694846901,
  "aud": "https://appleid.apple.com",
  "sub": "com.99degree.jari-bean",
  "iat": 1694843301
}

Signature

인증키를 통해 ES256 사인을 하시면 됩니다. 제가 .p8.pem 형태의 인증서를 둝다 드릴테니, 편하신 방법을 골라서 서명해주시면 될 것 같습니다. 아래 예시코드에는 .p8형태를 사용하고 있네요. 근데 아마 .pem 형식을 쓰시면 저 변환 함수가 따로 필요 없고 그냥 key만 읽어오시면 될겁니다.

Jwts.builder()
               .setHeaderParam("kid", keyId)
               .setHeaderParam("alg", "ES256")
               .setIssuer(teamId)
               .setIssuedAt(new Date(System.currentTimeMillis()))
               .setExpiration(expirationDate)
               .setAudience("https://appleid.apple.com")
               .setSubject(clientId)
               .signWith(SignatureAlgorithm.ES256, getPrivateKey())
               .compact();

private PrivateKey getPrivateKey() throws IOException {
    ClassPathResource resource = new ClassPathResource("***.p8");
    String privateKey = new String(Files.readAllBytes(Paths.get(resource.getURI())));
    Reader pemReader = new StringReader(privateKey);
    PEMParser pemParser = new PEMParser(pemReader);
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
    PrivateKeyInfo object = (PrivateKeyInfo) pemParser.readObject();
    return converter.getPrivateKey(object);
}

여기에 사용된 kidiss는 노출되면 안되기 때문에, 제가 따로 전달해드리겠습니다.

LineNo2 commented 1 year ago

/auth/token

응답

해당 엔드포인트에 요청하시면, 다음과 같은 형태로 도착합니다. Postman에도 있으니까, 확인해보시면 될 듯 합니다. client_secret값을 고정된 값으로 하시면 아마 안될겁니다. 유효기간에서 문제가 발생할 듯 싶기때문에 상단 함수를 그대로 사용하시면 될 듯 합니다.

{
    "access_token": "...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "refresh_token": "...",
    "id_token": "..."
}

여기서 저희는 id_token만 가지고 오면 유저의 정보를 확인할 수 있습니다.

JWT-Payload

여기서 sub를 보시면 됩니다. 각 서비스에 대해 애플에서 생성해주는 각 유저에 대한 유일한 값이라고 합니다. 아무튼 중복될 걱정이 없다는 것이니, 이거 사용하셔서 유저 생성하시면 될 것 같습니다.

isayaksh commented 1 year ago

수정사항

기존 kakao처럼의 jaribean://의 콜백은 필요하지 않을 것 같습니다. 해당 핑퐁 과정은 스킵하고, 바로 code를 받아 검증하는 작업 후 로그인 처리 해주시면 될 것 같습니다.

소셜 로그인 기능을 구현하기 위한 Redirect URI, Client ID, Client Secret에 대한 정보가 필요합니다! 공유 부탁드리겠습니다!

LineNo2 commented 1 year ago

수정사항

기존 kakao처럼의 jaribean://의 콜백은 필요하지 않을 것 같습니다. 해당 핑퐁 과정은 스킵하고, 바로 code를 받아 검증하는 작업 후 로그인 처리 해주시면 될 것 같습니다.

소셜 로그인 기능을 구현하기 위한 Redirect URI, Client ID, Client Secret에 대한 정보가 필요합니다! 공유 부탁드리겠습니다!

RedirectURI는 저희가 SDK를 활용해서 로그인을 하고 + iOS에서만 지원 할 예정이기 때문에 따로 필요가 없을 것 같습니다. ClientSecret은 저희가 *.p8 또는 *.pem 인증서를 통해 jwt를 발급하면 만들 수 있습니다. 이점은 Postman 참고하시면 될 것 같습니다. 인증서는 제가 메일로 보내드리겠습니다.