Skip to content

Commit

Permalink
refactor User Info classes
Browse files Browse the repository at this point in the history
  • Loading branch information
kh77 committed Mar 29, 2021
1 parent 68216bb commit d286e74
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 209 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Validate Social login token at back-end and get profile information

# Social Login (IOS, Google, Facebook)
# Social Login (IOS, Google, Facebook, Linkedin)
- Create Web Project in developer console of social platform
- Using developer console and get the access token then hit the API

Expand All @@ -15,17 +15,19 @@
- Exchange authorization code for token then you will get id_token


-- Linkedin
- Linkedin
- https://www.linkedin.com/developers
- Get client id and secret
- Hit below url to get code and use this code in request body for token field
- https://www.linkedin.com/oauth/v2/authorization?client_id=helloworld&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fhome&response_type=code&state=abcdef&scope=r_liteprofile%20r_emailaddress
- No playground has been found for linkedin


- Swagger
- http:https://localhost:8080/app/swagger-ui.html



- For Facebook
- Request body
- {
Expand All @@ -34,6 +36,7 @@
}



- For Google
- Request body
- {
Expand All @@ -42,6 +45,7 @@
}



- For Linkedin
- Request body
- {
Expand Down
76 changes: 31 additions & 45 deletions src/main/java/com/sm/config/social/SocialClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
import com.sm.common.util.DateUtil;
import com.sm.common.util.SecureStringUtil;
import com.sm.config.social.ios.IOSClient;
import com.sm.config.social.user.FacebookUser;
import com.sm.config.social.user.GoogleUser;
import com.sm.config.social.user.IOSInfo;
import com.sm.config.social.user.LinkedinInfo;
import com.sm.config.social.user.*;
import com.sm.controller.dto.request.SocialRequestModel;
import com.sm.dto.response.user.UserDto;
import org.json.JSONObject;
Expand Down Expand Up @@ -65,6 +62,7 @@ public UserDto getFacebookUser(String accessToken) {
variables.put("access_token", accessToken);
FacebookUser facebookUser = restTemplate.getForObject(FACEBOOK_GRAPH_API_BASE + FACEBOOK_PATH, FacebookUser.class, variables);
userDto = convertTo(facebookUser);
userDto.setProvider("facebook");
}catch (Exception e){
logger.error("While fetching facebook data, getting Exception :",e);
throw new GenericErrorException(ErrorType.TOKEN_BAD_REQUEST.getCode(),ErrorType.TOKEN_BAD_REQUEST.getMessage(),e);
Expand All @@ -88,6 +86,7 @@ public UserDto getGoogleUser(String accessToken) {
variables.put("id_token", accessToken);
GoogleUser googleUser = restTemplate.getForObject(GOOGLE_API_BASE + GOOGLE_PATH, GoogleUser.class, variables);
userDto = convertTo(googleUser);
userDto.setProvider("google");
}catch (Exception e){
logger.error("While fetching google data, getting Exception :",e);
throw new GenericErrorException(ErrorType.TOKEN_BAD_REQUEST.getCode(),ErrorType.TOKEN_BAD_REQUEST.getMessage(),e);
Expand All @@ -113,6 +112,7 @@ public UserDto getAppleUser(SocialRequestModel socialRequestModel,String clientS

IOSInfo appleInfo =appleClient.retrieveData(clientSecret, socialRequestModel.getToken());
userDto = convertTo(appleInfo);
userDto.setProvider("apple");

if(socialRequestModel.getFirstName() != null)
userDto.setFirstName(socialRequestModel.getFirstName());
Expand All @@ -123,10 +123,15 @@ public UserDto getAppleUser(SocialRequestModel socialRequestModel,String clientS
}


/**
* fetch linkedin user data and convert to UserDto
* @param authorizationCode
* @return
*/
public UserDto getLinkedinInfo(String authorizationCode){
String redirectUrl = "http:https://localhost:8080/home";
String clientId = "abcdef";
String clientSecret = "helloworld";
String clientId = "hello";
String clientSecret = "world";
//authorization code for access token
String accessTokenUri ="https://www.linkedin.com/oauth/v2/accessToken?grant_type=authorization_code&code="+authorizationCode+"&redirect_uri="+redirectUrl+"&client_id="+clientId+"&client_secret="+clientSecret+"";
String accessTokenRequest = restTemplate.getForObject(accessTokenUri, String.class);
Expand Down Expand Up @@ -154,10 +159,17 @@ public UserDto getLinkedinInfo(String authorizationCode){
}

linkedinInfo = getLinkedinEmailInfo(entity, linkedinInfo);
return convertTo(linkedinInfo);

UserDto userDto = convertTo(linkedinInfo);
userDto.setProvider("linkedin");
return userDto;
}

/**
* get email from linkedin
* @param entity
* @param linkedinInfo
* @return
*/
private LinkedinInfo getLinkedinEmailInfo(HttpEntity<String> entity, LinkedinInfo linkedinInfo) {
ResponseEntity<String> linkedinDetailRequest;
String emailUri = "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))";
Expand All @@ -170,46 +182,20 @@ private LinkedinInfo getLinkedinEmailInfo(HttpEntity<String> entity, LinkedinInf
return linkedinInfo;
}

private UserDto convertTo(FacebookUser facebookUser) {
UserDto userDto = new UserDto();
userDto.setProviderId(facebookUser.getId());
userDto.setProvider("facebook");
userDto.setEmail(facebookUser.getEmail());
userDto.setFirstName(facebookUser.getFirstName());
userDto.setLastName(facebookUser.getLastName());
userDto.setPassword(SecureStringUtil.randomString(30));
return userDto;
}

private UserDto convertTo(GoogleUser googleUser) {
UserDto userDto = new UserDto();
userDto.setProviderId(googleUser.getSub());
userDto.setProvider("google");
userDto.setEmail(googleUser.getEmail());
userDto.setFirstName(googleUser.getGivenName());
userDto.setLastName(googleUser.getFamilyName());
userDto.setPassword(SecureStringUtil.randomString(30));
userDto.setPicture(googleUser.getPicture());
return userDto;
}

private UserDto convertTo(IOSInfo appleInfo) {
/**
* Create user data from social platform
* @param genericUser
* @return
*/
private UserDto convertTo(GenericUser genericUser) {
UserDto userDto = new UserDto();
userDto.setProviderId(appleInfo.getId());
userDto.setProvider("ios");
userDto.setEmail(appleInfo.getEmail());
userDto.setProviderId(genericUser.getId());
userDto.setEmail(genericUser.getEmail());
userDto.setFirstName(genericUser.getFirstName());
userDto.setLastName(genericUser.getLastName());
userDto.setGender(genericUser.getGender());
userDto.setPassword(SecureStringUtil.randomString(30));
return userDto;
}

private UserDto convertTo(LinkedinInfo linkedinInfo) {
UserDto userDto = new UserDto();
userDto.setProviderId(linkedinInfo.getId());
userDto.setProvider("linkedin");
userDto.setEmail(linkedinInfo.getEmail());
userDto.setFirstName(linkedinInfo.getLocalizedFirstName());
userDto.setLastName(linkedinInfo.getLocalizedLastName());
userDto.setPassword(SecureStringUtil.randomString(30));
return userDto;
}
}
47 changes: 4 additions & 43 deletions src/main/java/com/sm/config/social/user/FacebookUser.java
Original file line number Diff line number Diff line change
@@ -1,62 +1,23 @@
package com.sm.config.social.user;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;


import java.util.Map;

public class FacebookUser {
private String id;
@JsonIgnoreProperties(ignoreUnknown = true)
public class FacebookUser extends GenericUser{

@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
private String email;
private String gender;
Map<String, Object> attributes;
// private FacebookPicture picture;

public FacebookUser(){}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public Map<String, Object> getAttributes() {
return attributes;
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/com/sm/config/social/user/GenericUser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.sm.config.social.user;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class GenericUser {

private String id;
private String email;
private String gender;
private String firstName;
private String lastName;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}
}
56 changes: 12 additions & 44 deletions src/main/java/com/sm/config/social/user/GoogleUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,25 @@

import com.fasterxml.jackson.annotation.JsonProperty;

public class GoogleUser {
private String sub;
private String email;
private String gender;
@JsonProperty("given_name")
private String givenName;
public class GoogleUser extends GenericUser{
@JsonProperty("sub")
private String id;
// @JsonProperty("given_name")
// private String givenName;
private String name;
@JsonProperty("family_name")
private String familyName;
// @JsonProperty("family_name")
// private String familyName;
private String rawUserInfo;
private String picture;

public GoogleUser(){}

public String getSub() {
return sub;
}

public void setSub(String sub) {
this.sub = sub;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getGender() {
return gender;
}
@JsonProperty("given_name")
private String firstName;
@JsonProperty("family_name")
private String lastName;

public void setGender(String gender) {
this.gender = gender;
}
public GoogleUser(){}

public String getGivenName() {
return givenName;
}

public void setGivenName(String givenName) {
this.givenName = givenName;
}

public String getName() {
return name;
Expand All @@ -56,13 +30,7 @@ public void setName(String name) {
this.name = name;
}

public String getFamilyName() {
return familyName;
}

public void setFamilyName(String familyName) {
this.familyName = familyName;
}

public String getRawUserInfo() {
return rawUserInfo;
Expand Down
Loading

0 comments on commit d286e74

Please sign in to comment.