Merge branch 'Development' of https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot into Development
This commit is contained in:
commit
fa10688e98
|
@ -172,6 +172,13 @@
|
||||||
<version>2.7.0</version>
|
<version>2.7.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- facebook Login -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.social</groupId>
|
||||||
|
<artifactId>spring-social-facebook</artifactId>
|
||||||
|
<version>2.0.3.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- Various libs -->
|
<!-- Various libs -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.json.JSONObject;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.bind.annotation.CrossOrigin;
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
@ -58,7 +59,7 @@ public class DatasetProfileController extends BaseController{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
@RequestMapping(method = RequestMethod.POST, value = { "/datasetprofile/save/{id}" }, consumes="application/json",produces="application/json")
|
@RequestMapping(method = RequestMethod.POST, value = { "/datasetprofile/save/{id}" }, consumes="application/json",produces="application/json")
|
||||||
public ResponseEntity<Object> updateDataset(@PathVariable String id,@RequestBody PropertiesModel properties){
|
public ResponseEntity<Object> updateDataset(@PathVariable String id,@RequestBody PropertiesModel properties){
|
||||||
try {
|
try {
|
||||||
|
@ -73,6 +74,7 @@ public class DatasetProfileController extends BaseController{
|
||||||
return ResponseEntity.status(HttpStatus.OK).body(properties);
|
return ResponseEntity.status(HttpStatus.OK).body(properties);
|
||||||
}
|
}
|
||||||
catch(Exception ex) {
|
catch(Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Serialization issue: "+ex.getMessage());
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Serialization issue: "+ex.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ public class Login {
|
||||||
public @ResponseBody ResponseItem<Principal> googleLogin(@RequestBody LoginInfo credentials) {
|
public @ResponseBody ResponseItem<Principal> googleLogin(@RequestBody LoginInfo credentials) {
|
||||||
try {
|
try {
|
||||||
return new ResponseItem<Principal>().payload(customAuthenticationProvider.authenticate(credentials)).status(HttpStatus.OK);
|
return new ResponseItem<Principal>().payload(customAuthenticationProvider.authenticate(credentials)).status(HttpStatus.OK);
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
return new ResponseItem<Principal>().status(HttpStatus.BAD_REQUEST).message(ex.getMessage());
|
return new ResponseItem<Principal>().status(HttpStatus.BAD_REQUEST).message(ex.getMessage());
|
||||||
|
|
|
@ -259,7 +259,11 @@ import com.fasterxml.jackson.annotation.ObjectIdGenerators;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Dataset entity) {
|
public void update(Dataset entity) {
|
||||||
|
this.setRegistries(entity.getRegistries());
|
||||||
|
this.setDataRepositories(entity.getDataRepositories());
|
||||||
|
this.setDescription(entity.getDescription());
|
||||||
|
this.setLabel(entity.getLabel());
|
||||||
|
this.setProperties(entity.getProperties());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -41,8 +41,8 @@ public class DatasetManager {
|
||||||
eu.eudat.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id));
|
eu.eudat.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id));
|
||||||
eu.eudat.models.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(datasetEntity.getProfile());
|
eu.eudat.models.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(datasetEntity.getProfile());
|
||||||
datasetprofile.setStatus(dataset.getStatus());
|
datasetprofile.setStatus(dataset.getStatus());
|
||||||
if(dataset.getProperties()!=null){
|
if(datasetEntity.getProperties()!=null){
|
||||||
JSONObject jobject = new JSONObject(dataset.getProperties());
|
JSONObject jobject = new JSONObject(datasetEntity.getProperties());
|
||||||
Map<String,Object> properties = (Map<String, Object>)jobject.toMap();
|
Map<String,Object> properties = (Map<String, Object>)jobject.toMap();
|
||||||
datasetprofile.fromJsonObject(properties);
|
datasetprofile.fromJsonObject(properties);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package eu.eudat.models.login;
|
package eu.eudat.models.login;
|
||||||
|
|
||||||
|
import eu.eudat.security.validators.TokenValidatorFactoryImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by ikalyvas on 12/18/2017.
|
* Created by ikalyvas on 12/18/2017.
|
||||||
*/
|
*/
|
||||||
public class LoginInfo {
|
public class LoginInfo {
|
||||||
private String ticket;
|
private String ticket;
|
||||||
private String service;
|
private TokenValidatorFactoryImpl.LoginProvider provider;
|
||||||
|
|
||||||
public String getTicket() {
|
public String getTicket() {
|
||||||
return ticket;
|
return ticket;
|
||||||
}
|
}
|
||||||
|
@ -15,11 +16,11 @@ public class LoginInfo {
|
||||||
this.ticket = ticket;
|
this.ticket = ticket;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getService() {
|
public TokenValidatorFactoryImpl.LoginProvider getProvider() {
|
||||||
return service;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setService(String service) {
|
public void setProvider(Integer provider) {
|
||||||
this.service = service;
|
this.provider = TokenValidatorFactoryImpl.LoginProvider.fromInteger(provider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import java.util.Map;
|
||||||
public class Section implements PropertiesGenerator{
|
public class Section implements PropertiesGenerator{
|
||||||
|
|
||||||
private List<Section> sections;
|
private List<Section> sections;
|
||||||
private List<Group> fieldGroups;
|
private List<FieldSet> compositeFields;
|
||||||
|
|
||||||
public List<Section> getSections() {
|
public List<Section> getSections() {
|
||||||
return sections;
|
return sections;
|
||||||
|
@ -14,16 +14,19 @@ public class Section implements PropertiesGenerator{
|
||||||
public void setSections(List<Section> sections) {
|
public void setSections(List<Section> sections) {
|
||||||
this.sections = sections;
|
this.sections = sections;
|
||||||
}
|
}
|
||||||
public List<Group> getFieldGroups() {
|
|
||||||
return fieldGroups;
|
public List<FieldSet> getCompositeFields() {
|
||||||
|
return compositeFields;
|
||||||
}
|
}
|
||||||
public void setFieldGroups(List<Group> fieldGroups) {
|
|
||||||
this.fieldGroups = fieldGroups;
|
public void setCompositeFields(List<FieldSet> compositeFields) {
|
||||||
|
this.compositeFields = compositeFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void toMap(Map<String, Object> fieldValues) {
|
public void toMap(Map<String, Object> fieldValues) {
|
||||||
this.sections.forEach(item->item.toMap(fieldValues));
|
this.sections.forEach(item->item.toMap(fieldValues));
|
||||||
this.fieldGroups.forEach(item->item.toMap(fieldValues));
|
this.compositeFields.forEach(item->item.toMap(fieldValues));
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void toMap(Map<String, Object> fieldValues, int index) {
|
public void toMap(Map<String, Object> fieldValues, int index) {
|
||||||
|
|
|
@ -105,14 +105,15 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit
|
||||||
this.visible = visible;
|
this.visible = visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<eu.eudat.models.admin.components.datasetprofile.Field.ValidationType> getValidations() {
|
public List<Integer> getValidations() {
|
||||||
return validations;
|
return this.validations.stream().map(item->(int)item.getValue()).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setValidations(List<eu.eudat.models.admin.components.datasetprofile.Field.ValidationType> validations) {
|
public void setValidations(List<Integer> validations) {
|
||||||
this.validations = validations;
|
this.validations = eu.eudat.models.admin.components.datasetprofile.Field.ValidationType.fromIntegers(validations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Field cloneForMultiplicity(String key, Map<String, Object> properties){
|
public Field cloneForMultiplicity(String key, Map<String, Object> properties){
|
||||||
Field newField = new Field();
|
Field newField = new Field();
|
||||||
newField.id = key;
|
newField.id = key;
|
||||||
|
|
|
@ -2,41 +2,30 @@ package eu.eudat.security;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.naming.NameAlreadyBoundException;
|
|
||||||
|
|
||||||
import eu.eudat.models.login.Credentials;
|
|
||||||
import eu.eudat.models.login.LoginInfo;
|
import eu.eudat.models.login.LoginInfo;
|
||||||
import eu.eudat.models.security.Principal;
|
import eu.eudat.models.security.Principal;
|
||||||
|
import eu.eudat.security.validators.TokenValidatorFactory;
|
||||||
|
import eu.eudat.security.validators.TokenValidatorFactoryImpl;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.authentication.AuthenticationProvider;
|
|
||||||
import org.springframework.security.authentication.AuthenticationServiceException;
|
import org.springframework.security.authentication.AuthenticationServiceException;
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.Authentication;
|
|
||||||
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import eu.eudat.dao.entities.UserInfoDao;
|
import eu.eudat.dao.entities.UserInfoDao;
|
||||||
import eu.eudat.entities.UserInfo;
|
|
||||||
import eu.eudat.exceptions.NonValidTokenException;
|
import eu.eudat.exceptions.NonValidTokenException;
|
||||||
import eu.eudat.security.validators.GoogleTokenValidator;
|
import eu.eudat.security.validators.google.GoogleTokenValidator;
|
||||||
import eu.eudat.security.validators.NativeTokenValidator;
|
|
||||||
import eu.eudat.security.validators.TokenValidator;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class CustomAuthenticationProvider {
|
public class CustomAuthenticationProvider {
|
||||||
|
|
||||||
|
|
||||||
@Autowired private UserInfoDao userInfoDao;
|
@Autowired private TokenValidatorFactory tokenValidatorFactory;
|
||||||
|
|
||||||
@Autowired private GoogleTokenValidator googleTokenValidator;
|
|
||||||
@Autowired private NativeTokenValidator nativeTokenValidator;
|
|
||||||
|
|
||||||
public Principal authenticate(LoginInfo credentials) throws AuthenticationException, GeneralSecurityException {
|
public Principal authenticate(LoginInfo credentials) throws AuthenticationException, GeneralSecurityException {
|
||||||
String token = credentials.getTicket();
|
String token = credentials.getTicket();
|
||||||
try {
|
try {
|
||||||
Principal principal = googleTokenValidator.validateToken(token);
|
Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(token);
|
||||||
return principal;
|
return principal;
|
||||||
} catch (NonValidTokenException e) {
|
} catch (NonValidTokenException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
package eu.eudat.security;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.servlet.FilterChain;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.ServletRequest;
|
|
||||||
import javax.servlet.ServletResponse;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
|
||||||
import org.springframework.web.filter.GenericFilterBean;
|
|
||||||
|
|
||||||
|
|
||||||
public class TokenAuthenticationFilter extends GenericFilterBean {
|
|
||||||
|
|
||||||
// public static final String HEADER_TOKEN_FIELD = "Authorization";
|
|
||||||
|
|
||||||
public static final String HEADER_NATIVE_TOKEN_FIELD = "native-token";
|
|
||||||
public static final String HEADER_GOOGLE_TOKEN_FIELD = "google-token";
|
|
||||||
public static final char HEADERNAME_USERNAME_DELIMITER = 0x1e; //specially crafted delimiter
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
|
|
||||||
|
|
||||||
final HttpServletRequest httpRequest = (HttpServletRequest) request;
|
|
||||||
|
|
||||||
String nativeToken = httpRequest.getHeader(HEADER_NATIVE_TOKEN_FIELD);
|
|
||||||
String googleToken = httpRequest.getHeader(HEADER_GOOGLE_TOKEN_FIELD);
|
|
||||||
//just pass the header, the username and the token into the credentials object of the UsernamePasswordAuthenticationToken class
|
|
||||||
UsernamePasswordAuthenticationToken authentication = null;
|
|
||||||
if(nativeToken != null)
|
|
||||||
authentication = new UsernamePasswordAuthenticationToken(HEADER_NATIVE_TOKEN_FIELD, nativeToken);
|
|
||||||
if(googleToken != null)
|
|
||||||
authentication = new UsernamePasswordAuthenticationToken(HEADER_GOOGLE_TOKEN_FIELD, googleToken);
|
|
||||||
|
|
||||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final HttpServletResponse httpResponse = (HttpServletResponse) response;
|
|
||||||
|
|
||||||
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
|
|
||||||
httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
|
|
||||||
httpResponse.setHeader("Access-Control-Max-Age", "7200");
|
|
||||||
httpResponse.setHeader("Access-Control-Allow-Headers", "content-type, X-CSRF-Token, "+HEADER_NATIVE_TOKEN_FIELD+", "+HEADER_GOOGLE_TOKEN_FIELD);
|
|
||||||
// httpResponse.addHeader("Access-Control-Expose-Headers", "xsrf-token , " +HEADER_NATIVE_TOKEN_FIELD+", "+HEADER_GOOGLE_TOKEN_FIELD);
|
|
||||||
|
|
||||||
|
|
||||||
if ("OPTIONS".equals(httpRequest.getMethod())) {
|
|
||||||
httpResponse.setStatus(HttpServletResponse.SC_OK);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
chain.doFilter(httpRequest, httpResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,83 +0,0 @@
|
||||||
package eu.eudat.security;
|
|
||||||
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import com.google.common.cache.Cache;
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class TokenSessionManager {
|
|
||||||
|
|
||||||
private final static long TOTAL_SESSION_MINUTES = 120L;
|
|
||||||
private final static long IDLE_MINUTES_EXPIRE = 20L;
|
|
||||||
|
|
||||||
private static Cache <String, String> cache; //that's thread-safe according to the documentation
|
|
||||||
|
|
||||||
private static TokenSessionManager instance = null; //should be one-per-classloader
|
|
||||||
|
|
||||||
|
|
||||||
public static synchronized TokenSessionManager getInstance() {
|
|
||||||
if (instance == null){
|
|
||||||
instance = new TokenSessionManager();
|
|
||||||
initialize();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void initialize() {
|
|
||||||
cache = CacheBuilder.newBuilder()
|
|
||||||
.expireAfterWrite(TOTAL_SESSION_MINUTES, TimeUnit.MINUTES)
|
|
||||||
.expireAfterAccess(IDLE_MINUTES_EXPIRE, TimeUnit.MINUTES)
|
|
||||||
.maximumSize(Long.MAX_VALUE)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getUser(String token) {
|
|
||||||
return cache.getIfPresent(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(String token, String user) {
|
|
||||||
cache.put(token, user);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String generateRandomAlphanumeric(int length) {
|
|
||||||
SecureRandom random = new SecureRandom();
|
|
||||||
byte bytes[] = new byte[length];
|
|
||||||
random.nextBytes(bytes);
|
|
||||||
return encode(bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private String encode(byte[] binaryData) {
|
|
||||||
int n = binaryData.length;
|
|
||||||
char[] HEXADECIMAL = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
||||||
char[] buffer = new char[n * 2];
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
int low = (binaryData[i] & 0x0f);
|
|
||||||
int high = ((binaryData[i] & 0xf0) >> 4);
|
|
||||||
buffer[i * 2] = HEXADECIMAL[high];
|
|
||||||
buffer[(i * 2) + 1] = HEXADECIMAL[low];
|
|
||||||
}
|
|
||||||
return new String(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String hashPassword (String password) throws NoSuchAlgorithmException {
|
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-256");
|
|
||||||
md.update(password.getBytes());
|
|
||||||
byte byteData[] = md.digest();
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
for (int i = 0; i < byteData.length; i++)
|
|
||||||
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
// public static void main(String [] args) throws NoSuchAlgorithmException {
|
|
||||||
// System.out.println(TokenSessionManager.getInstance().hashPassword("apa$$2gu3$$"));
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package eu.eudat.security.validators;
|
|
||||||
|
|
||||||
import eu.eudat.models.security.Principal;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
|
|
||||||
import eu.eudat.dao.entities.UserInfoDao;
|
|
||||||
import eu.eudat.entities.UserInfo;
|
|
||||||
import eu.eudat.exceptions.NonValidTokenException;
|
|
||||||
import eu.eudat.security.TokenSessionManager;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class NativeTokenValidator implements TokenValidator {
|
|
||||||
|
|
||||||
@Autowired private TokenSessionManager tokenSessionManager;
|
|
||||||
@Autowired private UserInfoDao userInfoDao;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Principal validateToken(String token) throws NonValidTokenException {
|
|
||||||
String tokenUser = tokenSessionManager.getUser(token);
|
|
||||||
if(tokenUser==null || tokenUser.isEmpty())
|
|
||||||
throw new NonValidTokenException("Login session has expired! Need to eu.eudat.login again!");
|
|
||||||
return new Principal();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -9,6 +9,6 @@ import java.security.GeneralSecurityException;
|
||||||
|
|
||||||
public interface TokenValidator {
|
public interface TokenValidator {
|
||||||
|
|
||||||
public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException;
|
Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
package eu.eudat.security.validators;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by ikalyvas on 1/9/2018.
|
||||||
|
*/
|
||||||
|
public interface TokenValidatorFactory {
|
||||||
|
TokenValidator getProvider(TokenValidatorFactoryImpl.LoginProvider provider);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package eu.eudat.security.validators;
|
||||||
|
|
||||||
|
import eu.eudat.models.project.Project;
|
||||||
|
import eu.eudat.security.validators.google.FacebookTokenValidator;
|
||||||
|
import eu.eudat.security.validators.google.GoogleTokenValidator;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by ikalyvas on 1/9/2018.
|
||||||
|
*/
|
||||||
|
@Service("tokenValidatorFactory")
|
||||||
|
public class TokenValidatorFactoryImpl implements TokenValidatorFactory{
|
||||||
|
public enum LoginProvider {
|
||||||
|
GOOGLE((short) 1), FACEBOOK((short) 2), TWITTER((short) 3), LINKEDIN((short) 4);
|
||||||
|
|
||||||
|
private short value;
|
||||||
|
|
||||||
|
private LoginProvider(short value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LoginProvider fromInteger(int value) {
|
||||||
|
switch (value) {
|
||||||
|
case 1:
|
||||||
|
return GOOGLE;
|
||||||
|
case 2:
|
||||||
|
return FACEBOOK;
|
||||||
|
case 3:
|
||||||
|
return TWITTER;
|
||||||
|
case 4:
|
||||||
|
return LINKEDIN;
|
||||||
|
default:
|
||||||
|
throw new RuntimeException("Unsupported LoginProvider");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private GoogleTokenValidator googleTokenValidator;
|
||||||
|
private FacebookTokenValidator facebookTokenValidator;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator) {
|
||||||
|
this.googleTokenValidator = googleTokenValidator;
|
||||||
|
this.facebookTokenValidator = facebookTokenValidator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenValidator getProvider(LoginProvider provider) {
|
||||||
|
switch (provider) {
|
||||||
|
case GOOGLE:
|
||||||
|
return this.googleTokenValidator;
|
||||||
|
case FACEBOOK:
|
||||||
|
return this.facebookTokenValidator;
|
||||||
|
default:
|
||||||
|
throw new RuntimeException("Login Provider Not Implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
package eu.eudat.security.validators.google;
|
||||||
|
|
||||||
|
import eu.eudat.dao.entities.UserInfoDao;
|
||||||
|
import eu.eudat.dao.entities.security.CredentialDao;
|
||||||
|
import eu.eudat.dao.entities.security.UserTokenDao;
|
||||||
|
import eu.eudat.entities.Credential;
|
||||||
|
import eu.eudat.entities.UserInfo;
|
||||||
|
import eu.eudat.entities.UserToken;
|
||||||
|
import eu.eudat.exceptions.NonValidTokenException;
|
||||||
|
import eu.eudat.models.criteria.UserInfoCriteria;
|
||||||
|
import eu.eudat.models.security.Principal;
|
||||||
|
import eu.eudat.security.validators.TokenValidator;
|
||||||
|
import eu.eudat.security.validators.TokenValidatorFactoryImpl;
|
||||||
|
import eu.eudat.services.ApiContext;
|
||||||
|
import eu.eudat.services.AuthenticationService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.social.connect.Connection;
|
||||||
|
import org.springframework.social.connect.ConnectionKey;
|
||||||
|
import org.springframework.social.facebook.api.Facebook;
|
||||||
|
import org.springframework.social.facebook.api.User;
|
||||||
|
import org.springframework.social.facebook.connect.FacebookConnectionFactory;
|
||||||
|
import org.springframework.social.facebook.connect.FacebookServiceProvider;
|
||||||
|
import org.springframework.social.oauth2.AccessGrant;
|
||||||
|
import org.springframework.social.oauth2.OAuth2Operations;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by ikalyvas on 1/9/2018.
|
||||||
|
*/
|
||||||
|
@Component("facebookTokenValidator")
|
||||||
|
public class FacebookTokenValidator implements TokenValidator {
|
||||||
|
|
||||||
|
private Environment environment;
|
||||||
|
private ApiContext apiContext;
|
||||||
|
private FacebookServiceProvider facebookServiceProvider;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public FacebookTokenValidator(Environment environment,ApiContext apiContext) {
|
||||||
|
this.environment = environment;
|
||||||
|
this.apiContext= apiContext;
|
||||||
|
this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"),this.environment.getProperty("facebook.login.namespace"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException {
|
||||||
|
User profile = getFacebookUserId(token);
|
||||||
|
|
||||||
|
UserInfoCriteria criteria = new UserInfoCriteria();
|
||||||
|
criteria.setEmail(profile.getEmail());
|
||||||
|
List<UserInfo> users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(criteria).toList();
|
||||||
|
UserInfo userInfo = null;
|
||||||
|
if(users.size()>0)userInfo = users.get(0);
|
||||||
|
final Credential credential = new Credential();
|
||||||
|
credential.setId(UUID.randomUUID());
|
||||||
|
credential.setCreationTime(new Date());
|
||||||
|
credential.setStatus(1);
|
||||||
|
credential.setLastUpdateTime(new Date());
|
||||||
|
credential.setProvider((int)TokenValidatorFactoryImpl.LoginProvider.FACEBOOK.getValue());
|
||||||
|
credential.setSecret(token);
|
||||||
|
if(userInfo == null) {
|
||||||
|
userInfo = new UserInfo();
|
||||||
|
userInfo.setName((String)profile.getName());
|
||||||
|
userInfo.setVerified_email(profile.isVerified());
|
||||||
|
userInfo.setEmail(profile.getEmail());
|
||||||
|
userInfo.setCreated(new Date());
|
||||||
|
userInfo.setLastloggedin(new Date());
|
||||||
|
userInfo.setAuthorization_level(new Short("1"));
|
||||||
|
userInfo.setUsertype(new Short("1"));
|
||||||
|
userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo);
|
||||||
|
|
||||||
|
credential.setPublicValue(userInfo.getName());
|
||||||
|
|
||||||
|
credential.setUserInfo(userInfo);
|
||||||
|
apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
userInfo.setLastloggedin(new Date());
|
||||||
|
Set<Credential> credentials = userInfo.getCredentials();
|
||||||
|
if(credentials.contains(credential)){
|
||||||
|
Credential oldCredential = credentials.stream().filter(item->credential.getProvider().equals(item.getProvider())).findFirst().get();
|
||||||
|
credential.setId(oldCredential.getId());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
credential.setUserInfo(userInfo);
|
||||||
|
credential.setId(UUID.randomUUID());
|
||||||
|
credential.setPublicValue(userInfo.getName());
|
||||||
|
|
||||||
|
apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential);
|
||||||
|
userInfo.getCredentials().add(credential);
|
||||||
|
}
|
||||||
|
userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
UserToken userToken = new UserToken();
|
||||||
|
userToken.setUser(userInfo);
|
||||||
|
userToken.setIssuedAt(new Date());
|
||||||
|
userToken.setToken(UUID.randomUUID());
|
||||||
|
userToken.setExpiresAt(addADay(new Date()));
|
||||||
|
apiContext.getDatabaseRepository().getUserTokenDao().create(userToken);
|
||||||
|
return apiContext.getAuthenticationService().Touch(userToken.getToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private User getFacebookUserId(String accessToken) {
|
||||||
|
String [] fields = { "id", "email", "first_name", "last_name","name" };
|
||||||
|
User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me",User.class,fields);
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Date addADay(Date date){
|
||||||
|
Date dt = new Date();
|
||||||
|
Calendar c = Calendar.getInstance();
|
||||||
|
c.setTime(dt);
|
||||||
|
c.add(Calendar.DATE, 1);
|
||||||
|
dt = c.getTime();
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package eu.eudat.security.validators;
|
package eu.eudat.security.validators.google;
|
||||||
|
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -15,6 +15,8 @@ import eu.eudat.entities.Credential;
|
||||||
import eu.eudat.entities.UserToken;
|
import eu.eudat.entities.UserToken;
|
||||||
import eu.eudat.models.criteria.UserInfoCriteria;
|
import eu.eudat.models.criteria.UserInfoCriteria;
|
||||||
import eu.eudat.models.login.LoginInfo;
|
import eu.eudat.models.login.LoginInfo;
|
||||||
|
import eu.eudat.security.validators.TokenValidator;
|
||||||
|
import eu.eudat.security.validators.TokenValidatorFactoryImpl;
|
||||||
import eu.eudat.services.AuthenticationService;
|
import eu.eudat.services.AuthenticationService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
@ -31,12 +33,10 @@ import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.REDIRECT_URI;
|
import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.REDIRECT_URI;
|
||||||
|
|
||||||
@Component
|
@Component("googleTokenValidator")
|
||||||
public class GoogleTokenValidator implements TokenValidator {
|
public class GoogleTokenValidator implements TokenValidator {
|
||||||
|
|
||||||
private static final JacksonFactory jacksonFactory = new JacksonFactory();
|
|
||||||
private static final HttpTransport transport = new NetHttpTransport();
|
private static final HttpTransport transport = new NetHttpTransport();
|
||||||
|
|
||||||
@Autowired private UserInfoDao userInfoDao;
|
@Autowired private UserInfoDao userInfoDao;
|
||||||
@Autowired private CredentialDao credentialDao;
|
@Autowired private CredentialDao credentialDao;
|
||||||
@Autowired private AuthenticationService authenticationService;
|
@Autowired private AuthenticationService authenticationService;
|
||||||
|
@ -73,7 +73,7 @@ public class GoogleTokenValidator implements TokenValidator {
|
||||||
credential.setCreationTime(new Date());
|
credential.setCreationTime(new Date());
|
||||||
credential.setStatus(1);
|
credential.setStatus(1);
|
||||||
credential.setLastUpdateTime(new Date());
|
credential.setLastUpdateTime(new Date());
|
||||||
credential.setProvider(1);
|
credential.setProvider((int)TokenValidatorFactoryImpl.LoginProvider.GOOGLE.getValue());
|
||||||
credential.setSecret(token);
|
credential.setSecret(token);
|
||||||
if(userInfo == null) {
|
if(userInfo == null) {
|
||||||
userInfo = new UserInfo();
|
userInfo = new UserInfo();
|
|
@ -12,4 +12,5 @@ public interface ApiContext {
|
||||||
InvitationService getInvitationService();
|
InvitationService getInvitationService();
|
||||||
RemoteFetcher getRemoteFetcher();
|
RemoteFetcher getRemoteFetcher();
|
||||||
MailService getMailService();
|
MailService getMailService();
|
||||||
|
AuthenticationService getAuthenticationService();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ public class ApiContextImpl implements ApiContext{
|
||||||
private RemoteFetcher remoteFetcher;
|
private RemoteFetcher remoteFetcher;
|
||||||
private InvitationService invitationService;
|
private InvitationService invitationService;
|
||||||
private MailService mailService;
|
private MailService mailService;
|
||||||
|
private AuthenticationService authenticationService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public void setDatabaseRepository(DatabaseRepository databaseRepository) {
|
public void setDatabaseRepository(DatabaseRepository databaseRepository) {
|
||||||
|
@ -66,4 +67,14 @@ public class ApiContextImpl implements ApiContext{
|
||||||
public void setMailService(MailService mailService) {
|
public void setMailService(MailService mailService) {
|
||||||
this.mailService = mailService;
|
this.mailService = mailService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthenticationService getAuthenticationService() {
|
||||||
|
return authenticationService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setAuthenticationService(AuthenticationService authenticationService) {
|
||||||
|
this.authenticationService = authenticationService;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package eu.eudat.services;
|
package eu.eudat.services;
|
||||||
|
|
||||||
import eu.eudat.dao.entities.*;
|
import eu.eudat.dao.entities.*;
|
||||||
|
import eu.eudat.dao.entities.security.CredentialDao;
|
||||||
|
import eu.eudat.dao.entities.security.UserTokenDao;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by ikalyvas on 1/4/2018.
|
* Created by ikalyvas on 1/4/2018.
|
||||||
|
@ -23,4 +25,6 @@ public interface DatabaseRepository {
|
||||||
InvitationDao getInvitationDao();
|
InvitationDao getInvitationDao();
|
||||||
DMPProfileDao getDmpProfileDao();
|
DMPProfileDao getDmpProfileDao();
|
||||||
DMPResearcherDao getDmpResearcherDao();
|
DMPResearcherDao getDmpResearcherDao();
|
||||||
|
CredentialDao getCredentialDao();
|
||||||
|
UserTokenDao getUserTokenDao();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package eu.eudat.services;
|
package eu.eudat.services;
|
||||||
|
|
||||||
import eu.eudat.dao.entities.*;
|
import eu.eudat.dao.entities.*;
|
||||||
|
import eu.eudat.dao.entities.security.CredentialDao;
|
||||||
|
import eu.eudat.dao.entities.security.UserTokenDao;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@ -25,7 +27,8 @@ public class DatabaseRepositoryImpl implements DatabaseRepository{
|
||||||
private ServiceDao serviceDao;
|
private ServiceDao serviceDao;
|
||||||
private UserInfoDao userInfoDao;
|
private UserInfoDao userInfoDao;
|
||||||
private InvitationDao invitationDao;
|
private InvitationDao invitationDao;
|
||||||
|
private CredentialDao credentialDao;
|
||||||
|
private UserTokenDao userTokenDao;
|
||||||
@Autowired
|
@Autowired
|
||||||
private void setDataRepositoryDao(DataRepositoryDao dataRepositoryDao) {
|
private void setDataRepositoryDao(DataRepositoryDao dataRepositoryDao) {
|
||||||
this.dataRepositoryDao = dataRepositoryDao;
|
this.dataRepositoryDao = dataRepositoryDao;
|
||||||
|
@ -185,4 +188,24 @@ public class DatabaseRepositoryImpl implements DatabaseRepository{
|
||||||
public void setInvitationDao(InvitationDao invitationDao) {
|
public void setInvitationDao(InvitationDao invitationDao) {
|
||||||
this.invitationDao = invitationDao;
|
this.invitationDao = invitationDao;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CredentialDao getCredentialDao() {
|
||||||
|
return credentialDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setCredentialDao(CredentialDao credentialDao) {
|
||||||
|
this.credentialDao = credentialDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserTokenDao getUserTokenDao() {
|
||||||
|
return userTokenDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setUserTokenDao(UserTokenDao userTokenDao) {
|
||||||
|
this.userTokenDao = userTokenDao;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
##########################Persistence##########################################
|
##########################Persistence##########################################
|
||||||
database.driver-class-name=org.postgresql.Driver
|
database.driver-class-name=org.postgresql.Driver
|
||||||
database.url = jdbc:postgresql://develdb1.madgik.di.uoa.gr:5432/dmptool
|
database.url = jdbc:postgresql://develdb1.madgik.di.uoa.gr:5432/dmptool
|
||||||
|
database.username = dmptool
|
||||||
|
database.password = dmpt00lu$r
|
||||||
##########################/Persistence##########################################
|
##########################/Persistence##########################################
|
||||||
|
|
||||||
###################Allowed Proxy Service Host ############################
|
###################Allowed Proxy Service Host ############################
|
||||||
|
@ -17,7 +18,8 @@ configuration.externalUrls = file:///C:\\Users\\ikalyvas\\Documents\\Projects\\O
|
||||||
########################/Email#############################
|
########################/Email#############################
|
||||||
spring.mail.default-encoding=UTF-8
|
spring.mail.default-encoding=UTF-8
|
||||||
spring.mail.host=smtp.gmail.com
|
spring.mail.host=smtp.gmail.com
|
||||||
|
spring.mail.username=kalivasioan@gmail.com
|
||||||
|
spring.mail.password=A3b*1*92
|
||||||
spring.mail.port=587
|
spring.mail.port=587
|
||||||
spring.mail.protocol=smtp
|
spring.mail.protocol=smtp
|
||||||
spring.mail.test-connection=false
|
spring.mail.test-connection=false
|
||||||
|
@ -27,9 +29,10 @@ mail.subject = Invitation to DMP Plan {dmpname}
|
||||||
mail.content = You have been invited to {dmpname} data management plan.Follow the link localhost:4200/invitation/{invitationID} to submit it
|
mail.content = You have been invited to {dmpname} data management plan.Follow the link localhost:4200/invitation/{invitationID} to submit it
|
||||||
mail.from = citesagrdev@gmail.com
|
mail.from = citesagrdev@gmail.com
|
||||||
|
|
||||||
########################Persistence/Hibernate Generic#############################
|
########################FACEBOOK LOGIN Properties#############################
|
||||||
|
facebook.login.clientId = 110586756143149
|
||||||
|
facebook.login.clientSecret = 522a847f05c873d0222c85109e24f55a
|
||||||
|
facebook.login.namespace = eudat
|
||||||
########################Persistence/Hibernate/Batch##############################
|
########################Persistence/Hibernate/Batch##############################
|
||||||
#persistence.hibernate.jdbc.batch_size = 30
|
#persistence.hibernate.jdbc.batch_size = 30
|
||||||
#persistence.hibernate.order_inserts = true
|
#persistence.hibernate.order_inserts = true
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<button mat-icon-button>
|
<button mat-icon-button>
|
||||||
<i class="fa fa-linkedin"></i>
|
<i class="fa fa-linkedin"></i>
|
||||||
</button>
|
</button>
|
||||||
<button mat-icon-button>
|
<button mat-icon-button (click)="facebookLogin()">
|
||||||
<i class="fa fa-facebook-square"></i>
|
<i class="fa fa-facebook-square"></i>
|
||||||
</button>
|
</button>
|
||||||
<button mat-icon-button>
|
<button mat-icon-button>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { LoginProviders } from '../models/login/LoginInfo';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { HttpClient } from '@angular/common/http';
|
||||||
import { Component, OnInit, ElementRef, AfterViewInit, VERSION, Injectable, NgZone } from '@angular/core';
|
import { Component, OnInit, ElementRef, AfterViewInit, VERSION, Injectable, NgZone } from '@angular/core';
|
||||||
import { Router, ActivatedRoute, Params } from "@angular/router";
|
import { Router, ActivatedRoute, Params } from "@angular/router";
|
||||||
|
@ -7,6 +8,7 @@ import { AuthService } from '../services/auth/auth.service';
|
||||||
import { SnackBarNotificationComponent } from '../shared/components/notificaiton/snack-bar-notification.component';
|
import { SnackBarNotificationComponent } from '../shared/components/notificaiton/snack-bar-notification.component';
|
||||||
|
|
||||||
declare const gapi: any;
|
declare const gapi: any;
|
||||||
|
declare const FB: any;
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'login',
|
selector: 'login',
|
||||||
|
@ -25,6 +27,8 @@ export class LoginComponent implements OnInit {
|
||||||
private zone: NgZone
|
private zone: NgZone
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
gapi.load('auth2', () => {
|
gapi.load('auth2', () => {
|
||||||
this.auth2 = gapi.auth2.init({
|
this.auth2 = gapi.auth2.init({
|
||||||
|
@ -34,6 +38,14 @@ export class LoginComponent implements OnInit {
|
||||||
});
|
});
|
||||||
this.attachGoogleSignin(document.getElementById('googleSignInButton'));
|
this.attachGoogleSignin(document.getElementById('googleSignInButton'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
FB.init({
|
||||||
|
appId: '110586756143149',
|
||||||
|
cookie: false, // enable cookies to allow the server to access
|
||||||
|
// the session
|
||||||
|
xfbml: true, // parse social plugins on this page
|
||||||
|
version: 'v2.8' // use graph api version 2.5
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public attachGoogleSignin(element) {
|
public attachGoogleSignin(element) {
|
||||||
|
@ -42,7 +54,7 @@ export class LoginComponent implements OnInit {
|
||||||
|
|
||||||
var id_token = googleUser.getAuthResponse().id_token;
|
var id_token = googleUser.getAuthResponse().id_token;
|
||||||
if (id_token) {
|
if (id_token) {
|
||||||
this.authService.login({ ticket: id_token, service: "google" }).subscribe(
|
this.authService.login({ ticket: id_token, provider: LoginProviders.Google }).subscribe(
|
||||||
res => this.onLogInSuccess(res),
|
res => this.onLogInSuccess(res),
|
||||||
error => this.onLogInError(error)
|
error => this.onLogInError(error)
|
||||||
)
|
)
|
||||||
|
@ -73,4 +85,17 @@ export class LoginComponent implements OnInit {
|
||||||
extraClasses: ['snackbar-warning']
|
extraClasses: ['snackbar-warning']
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public facebookLogin() {
|
||||||
|
|
||||||
|
FB.login((response: any) => {
|
||||||
|
if (response.status === 'connected' || 'not_authorized') {
|
||||||
|
this.authService.login({ ticket: response.authResponse.accessToken, provider: LoginProviders.Facebook }).subscribe(
|
||||||
|
res => this.onLogInSuccess(res),
|
||||||
|
error => this.onLogInError(error)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}, { scope: 'user_friends,email' });
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,9 @@
|
||||||
|
export enum LoginProviders{
|
||||||
|
Google = 1,
|
||||||
|
Facebook = 2
|
||||||
|
}
|
||||||
|
|
||||||
export class LoginInfo {
|
export class LoginInfo {
|
||||||
public ticket: string;
|
public ticket: string;
|
||||||
public service: string;
|
public provider: LoginProviders;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<meta name="csrf-token" content="2c64def7de30197c40276fe1a7ea874ca8871f70be7d7dc3305465a4d5c565e4">
|
<meta name="csrf-token" content="2c64def7de30197c40276fe1a7ea874ca8871f70be7d7dc3305465a4d5c565e4">
|
||||||
<!-- <meta name="viewport" content="width=device-width, initial-scale=1"> -->
|
<!-- <meta name="viewport" content="width=device-width, initial-scale=1"> -->
|
||||||
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
||||||
|
<script src="//connect.facebook.net/en_US/all.js"></script>
|
||||||
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
|
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
|
||||||
<script src="https://apis.google.com/js/platform.js" async defer></script>
|
<script src="https://apis.google.com/js/platform.js" async defer></script>
|
||||||
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
Loading…
Reference in New Issue