Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @ApiOperation(value = "OAuth2 SignIn/SignUp (Apple)")
- @ApiResponses(value = {@ApiResponse(code = 200, message = "Success", response = TokenResponse.class),
- @ApiResponse(code = 401, message = "Unauthorized"),
- @ApiResponse(code = 403, message="Forbidden"),
- @ApiResponse(code = 404, message = "Not Found"),
- @ApiResponse(code = 500, message = "Failure")})
- @GetMapping("oauth2/apple")
- 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 {
- AppleUser appleClaims;
- UriComponentsBuilder builder;
- ObjectMapper objectMapper = new ObjectMapper();
- if (referralCode != null) {
- Response response = this.loginService.validateReferralCode(referralCode);
- if (!response.isSuccess()){
- return new ResponseEntity<Response>(response,response.getStatus());
- }
- }
- String jwt = null;
- AuthorizationTokenResponse authorizationTokenResponse = null;
- try {
- jwt = appleVerifyAuthorizationService.generateJWT();
- } catch (Exception e) {
- e.printStackTrace();
- logger.error(e.getLocalizedMessage());
- return Response.getResponseData(false,"Could not generate JWT from private key.",null);
- }
- try {
- authorizationTokenResponse = appleVerifyAuthorizationService.getAuthTokenFromApple(jwt,authorizationCode);
- } catch (JsonProcessingException e) {
- logger.error(e.getLocalizedMessage());
- e.printStackTrace();
- return Response.getResponseData(false,"JSON processing exception",null);
- }
- if (authorizationTokenResponse == null) {
- return Response.getResponseData(false,"Authorization Failed", null);
- }
- System.out.println(authorizationTokenResponse.getId_token());
- //Getting Apple User Code Starts Here
- IdTokenHeader idTokenHeaderNew = null;
- try{
- idTokenHeaderNew = objectMapper.readValue(appleUserService.decodeIdTokenAndGetHeader(authorizationTokenResponse.getId_token()), IdTokenHeader.class);
- } catch (JsonProcessingException exception) {
- return Response.getResponseData(false,"Invalid form of new id token.", null);
- }
- System.out.println("kid - " + idTokenHeaderNew.getKid());
- //
- builder = UriComponentsBuilder.fromHttpUrl(appleConstants.getApplePublicKeyUri());
- Key key = appleUserService.getActualKeyOfApple(builder,idTokenHeaderNew.getKid());
- if (key == null) {
- return Response.getResponseData(false,"kId does not match with Apple.",null);
- }
- PublicKey publicKey = appleUserService.createAppleKeyToPublicKey(key);
- Claims claims = appleUserService.getClaims(publicKey, authorizationTokenResponse.getId_token());
- if (claims == null) {
- return Response.getResponseData(false,"Claims generation failed.",null);
- }
- System.out.println("CLAIMS ->>>>" +claims);
- appleClaims = appleUserService.getAppleClaimsFromClaims(claims);
- if (appleClaims == null) {
- return Response.getResponseData(false,"Could not retrieve Apple User",null);
- }
- logger.info(appleClaims.getEmail() + " successfully logged via apple login.");
- User prevUser = loginService.findByEmail(appleClaims.getEmail());
- if (prevUser == null && roleIdentifier == null) {
- return Response.getResponseData(false,"Looks like you don't have an account with us. Please click sign up to create a new account.",null);
- }
- User user = this.loginService.saveAppleUser(appleClaims.getEmail(), roleIdentifier,referralCode);
- if(user.getStatus()==UserStatus.BANNED) {
- return Response.getResponseData(false,"User is banned from the system.", null);
- }
- final UserDetails userDetails = customUserDetailsService.loadUserByUsername(user.getEmail());
- String accessToken = tokenProvider.generateToken(userDetails);
- return Response.getResponseData(true,"User Logged in",new TokenResponse(accessToken,refreshTokenService.createRefreshToken(user.getId()).getToken(),user) );
- }
- <!---------------------------------------------------------------------------------------------------------------->
- @Service
- public class AppleUserService {
- public Key getActualKeyOfApple (UriComponentsBuilder uriComponentsBuilder, String keyIdentifierFromApp) {
- RestTemplate restTemplate = new RestTemplate();
- UriComponentsBuilder builder;
- ApplePublicKeyResponse applePublicKeyResponse = restTemplate.getForObject(uriComponentsBuilder.toUriString(),ApplePublicKeyResponse.class);
- List<Key> appleKeys = applePublicKeyResponse.getKeys();
- Key actualKey = null;
- for (Key key : appleKeys) {
- if (key.getKid().contentEquals(keyIdentifierFromApp)) {
- actualKey = key;
- }
- }
- return actualKey;
- }
- public PublicKey createAppleKeyToPublicKey(Key applePublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
- var modulus = new BigInteger(1, java.util.Base64.getUrlDecoder().decode(applePublicKey.getN()));
- var exponent = new BigInteger(1, java.util.Base64.getUrlDecoder().decode(applePublicKey.getE()));
- return KeyFactory.getInstance(applePublicKey.getKty()).generatePublic(new RSAPublicKeySpec(modulus, exponent));
- }
- public Claims getClaims(PublicKey publicKey, String idToken){
- try {
- Claims claims = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(idToken).getBody();
- return claims;
- } catch(Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- public AppleUser getAppleClaimsFromClaims(Claims claims) {
- String iss = claims.get("iss", String.class);
- String aud = claims.get("aud", String.class);
- Date exp = claims.get("exp", Date.class);
- Date iat = claims.get("iat", Date.class);
- String appleIdentifier = claims.get("sub", String.class);
- String atHash = claims.get("at_hash", String.class);
- Long authTime = claims.get("auth_time", Long.class);
- String email = claims.get("email", String.class);
- String emailVerified = claims.get("email_verified", String.class);
- return new AppleUser(iss,aud,exp,iat,appleIdentifier,atHash,authTime,emailVerified,email);
- }
- public String decodeIdTokenAndGetHeader(String idTokenJWT){
- String[] split_string = idTokenJWT.split("\\.");
- String base64EncodedHeader = split_string[0];
- String base64EncodedBody = split_string[1];
- Base64 base64Url = new Base64(true);
- String header = new String(base64Url.decode(base64EncodedHeader));
- System.out.println(header);
- String body = new String(base64Url.decode(base64EncodedBody));
- return header;
- }
- }
Add Comment
Please, Sign In to add comment