Guest User

Untitled

a guest
Mar 11th, 2022
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. @ApiOperation(value = "OAuth2 SignIn/SignUp (Apple)")
  2. @ApiResponses(value = {@ApiResponse(code = 200, message = "Success", response = TokenResponse.class),
  3. @ApiResponse(code = 401, message = "Unauthorized"),
  4. @ApiResponse(code = 403, message="Forbidden"),
  5. @ApiResponse(code = 404, message = "Not Found"),
  6. @ApiResponse(code = 500, message = "Failure")})
  7. @GetMapping("oauth2/apple")
  8. public ResponseEntity<Response> appleSignUpIn(@RequestParam(value = "authorizationCode") String authorizationCode, @RequestParam(value = "roleIdentifier", required = false) RoleIdentifier roleIdentifier , @RequestParam(value = "referralCode",required = false) String referralCode) throws NoSuchAlgorithmException, InvalidKeySpecException {
  9. AppleUser appleClaims;
  10. UriComponentsBuilder builder;
  11. ObjectMapper objectMapper = new ObjectMapper();
  12. if (referralCode != null) {
  13. Response response = this.loginService.validateReferralCode(referralCode);
  14. if (!response.isSuccess()){
  15. return new ResponseEntity<Response>(response,response.getStatus());
  16. }
  17. }
  18. String jwt = null;
  19. AuthorizationTokenResponse authorizationTokenResponse = null;
  20. try {
  21. jwt = appleVerifyAuthorizationService.generateJWT();
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. logger.error(e.getLocalizedMessage());
  25. return Response.getResponseData(false,"Could not generate JWT from private key.",null);
  26. }
  27. try {
  28. authorizationTokenResponse = appleVerifyAuthorizationService.getAuthTokenFromApple(jwt,authorizationCode);
  29. } catch (JsonProcessingException e) {
  30. logger.error(e.getLocalizedMessage());
  31. e.printStackTrace();
  32. return Response.getResponseData(false,"JSON processing exception",null);
  33. }
  34. if (authorizationTokenResponse == null) {
  35. return Response.getResponseData(false,"Authorization Failed", null);
  36. }
  37.  
  38. System.out.println(authorizationTokenResponse.getId_token());
  39. //Getting Apple User Code Starts Here
  40. IdTokenHeader idTokenHeaderNew = null;
  41. try{
  42. idTokenHeaderNew = objectMapper.readValue(appleUserService.decodeIdTokenAndGetHeader(authorizationTokenResponse.getId_token()), IdTokenHeader.class);
  43. } catch (JsonProcessingException exception) {
  44. return Response.getResponseData(false,"Invalid form of new id token.", null);
  45. }
  46. System.out.println("kid - " + idTokenHeaderNew.getKid());
  47. //
  48. builder = UriComponentsBuilder.fromHttpUrl(appleConstants.getApplePublicKeyUri());
  49. Key key = appleUserService.getActualKeyOfApple(builder,idTokenHeaderNew.getKid());
  50. if (key == null) {
  51. return Response.getResponseData(false,"kId does not match with Apple.",null);
  52. }
  53. PublicKey publicKey = appleUserService.createAppleKeyToPublicKey(key);
  54.  
  55. Claims claims = appleUserService.getClaims(publicKey, authorizationTokenResponse.getId_token());
  56. if (claims == null) {
  57. return Response.getResponseData(false,"Claims generation failed.",null);
  58. }
  59. System.out.println("CLAIMS ->>>>" +claims);
  60. appleClaims = appleUserService.getAppleClaimsFromClaims(claims);
  61. if (appleClaims == null) {
  62. return Response.getResponseData(false,"Could not retrieve Apple User",null);
  63. }
  64. logger.info(appleClaims.getEmail() + " successfully logged via apple login.");
  65. User prevUser = loginService.findByEmail(appleClaims.getEmail());
  66. if (prevUser == null && roleIdentifier == null) {
  67. return Response.getResponseData(false,"Looks like you don't have an account with us. Please click sign up to create a new account.",null);
  68. }
  69.  
  70. User user = this.loginService.saveAppleUser(appleClaims.getEmail(), roleIdentifier,referralCode);
  71. if(user.getStatus()==UserStatus.BANNED) {
  72. return Response.getResponseData(false,"User is banned from the system.", null);
  73. }
  74.  
  75. final UserDetails userDetails = customUserDetailsService.loadUserByUsername(user.getEmail());
  76. String accessToken = tokenProvider.generateToken(userDetails);
  77.  
  78. return Response.getResponseData(true,"User Logged in",new TokenResponse(accessToken,refreshTokenService.createRefreshToken(user.getId()).getToken(),user) );
  79.  
  80. }
  81.  
  82. <!---------------------------------------------------------------------------------------------------------------->
  83.  
  84. @Service
  85. public class AppleUserService {
  86.  
  87. public Key getActualKeyOfApple (UriComponentsBuilder uriComponentsBuilder, String keyIdentifierFromApp) {
  88. RestTemplate restTemplate = new RestTemplate();
  89. UriComponentsBuilder builder;
  90. ApplePublicKeyResponse applePublicKeyResponse = restTemplate.getForObject(uriComponentsBuilder.toUriString(),ApplePublicKeyResponse.class);
  91. List<Key> appleKeys = applePublicKeyResponse.getKeys();
  92. Key actualKey = null;
  93. for (Key key : appleKeys) {
  94. if (key.getKid().contentEquals(keyIdentifierFromApp)) {
  95. actualKey = key;
  96. }
  97. }
  98. return actualKey;
  99. }
  100.  
  101. public PublicKey createAppleKeyToPublicKey(Key applePublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
  102. var modulus = new BigInteger(1, java.util.Base64.getUrlDecoder().decode(applePublicKey.getN()));
  103. var exponent = new BigInteger(1, java.util.Base64.getUrlDecoder().decode(applePublicKey.getE()));
  104. return KeyFactory.getInstance(applePublicKey.getKty()).generatePublic(new RSAPublicKeySpec(modulus, exponent));
  105. }
  106.  
  107. public Claims getClaims(PublicKey publicKey, String idToken){
  108. try {
  109. Claims claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(idToken).getBody();
  110. return claims;
  111. } catch(Exception e) {
  112. e.printStackTrace();
  113. return null;
  114. }
  115. }
  116.  
  117. public AppleUser getAppleClaimsFromClaims(Claims claims) {
  118. String iss = claims.get("iss", String.class);
  119. String aud = claims.get("aud", String.class);
  120. Date exp = claims.get("exp", Date.class);
  121. Date iat = claims.get("iat", Date.class);
  122. String appleIdentifier = claims.get("sub", String.class);
  123. String atHash = claims.get("at_hash", String.class);
  124. Long authTime = claims.get("auth_time", Long.class);
  125. String email = claims.get("email", String.class);
  126. String emailVerified = claims.get("email_verified", String.class);
  127. return new AppleUser(iss,aud,exp,iat,appleIdentifier,atHash,authTime,emailVerified,email);
  128. }
  129.  
  130. public String decodeIdTokenAndGetHeader(String idTokenJWT){
  131. String[] split_string = idTokenJWT.split("\\.");
  132. String base64EncodedHeader = split_string[0];
  133. String base64EncodedBody = split_string[1];
  134. Base64 base64Url = new Base64(true);
  135. String header = new String(base64Url.decode(base64EncodedHeader));
  136. System.out.println(header);
  137. String body = new String(base64Url.decode(base64EncodedBody));
  138. return header;
  139. }
  140.  
  141. }
Add Comment
Please, Sign In to add comment