diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml
index 82a0eea7e..9469010e8 100644
--- a/dmp-backend/pom.xml
+++ b/dmp-backend/pom.xml
@@ -186,6 +186,13 @@
1.0.0.RELEASE
+
+
+ org.springframework.social
+ spring-social-twitter
+ 1.1.2.RELEASE
+
+
diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java
index 6811264a8..02fce7364 100644
--- a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java
+++ b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java
@@ -1,13 +1,16 @@
package eu.eudat.controllers;
+import eu.eudat.exceptions.UnauthorisedException;
import eu.eudat.models.login.Credentials;
import eu.eudat.models.helpers.responses.ResponseItem;
import eu.eudat.models.login.LoginInfo;
import eu.eudat.models.security.Principal;
import eu.eudat.security.CustomAuthenticationProvider;
+import eu.eudat.security.validators.twitter.TwitterTokenValidator;
import eu.eudat.services.AuthenticationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
+import org.springframework.social.oauth1.OAuthToken;
import org.springframework.web.bind.annotation.*;
import javax.transaction.Transactional;
@@ -20,23 +23,43 @@ import javax.transaction.Transactional;
@RequestMapping(value = "/auth")
public class Login {
- @Autowired
private CustomAuthenticationProvider customAuthenticationProvider;
- @Autowired
private AuthenticationService authenticationService;
+ private TwitterTokenValidator twitterTokenValidator;
+
+ @Autowired
+ public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationService authenticationService, TwitterTokenValidator twitterTokenValidator) {
+ this.customAuthenticationProvider = customAuthenticationProvider;
+ this.authenticationService = authenticationService;
+ this.twitterTokenValidator = twitterTokenValidator;
+ }
+
@Transactional
@RequestMapping(method = RequestMethod.POST, value = { "/externallogin" }, consumes = "application/json", produces="application/json")
public @ResponseBody ResponseItem googleLogin(@RequestBody LoginInfo credentials) {
try {
return new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(HttpStatus.OK);
- } catch (Exception ex) {
+ }catch (UnauthorisedException ex){
+ throw ex;
+ }
+ catch (Exception ex) {
ex.printStackTrace();
return new ResponseItem().status(HttpStatus.BAD_REQUEST).message(ex.getMessage());
}
}
+ @RequestMapping(method = RequestMethod.GET, value = { "/twitterRequestToken" }, produces="application/json")
+ public @ResponseBody ResponseItem twitterRequestToken() {
+ try {
+ return new ResponseItem().payload(this.twitterTokenValidator.getRequestToken()).status(HttpStatus.OK);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return new ResponseItem().status(HttpStatus.BAD_REQUEST).message(ex.getMessage());
+ }
+ }
+
@RequestMapping(method = RequestMethod.POST, value = { "/me" }, consumes = "application/json", produces="application/json")
public @ResponseBody ResponseItem authMe(Principal principal) {
try {
diff --git a/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java b/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java
index c4d8ec834..d902a6212 100644
--- a/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java
+++ b/dmp-backend/src/main/java/eu/eudat/models/login/LoginInfo.java
@@ -8,6 +8,8 @@ import eu.eudat.security.validators.TokenValidatorFactoryImpl;
public class LoginInfo {
private String ticket;
private TokenValidatorFactoryImpl.LoginProvider provider;
+ private Object data;
+
public String getTicket() {
return ticket;
}
@@ -23,4 +25,12 @@ public class LoginInfo {
public void setProvider(Integer provider) {
this.provider = TokenValidatorFactoryImpl.LoginProvider.fromInteger(provider);
}
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
}
diff --git a/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java b/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java
index b54bb81d0..f60accb9d 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/CustomAuthenticationProvider.java
@@ -25,7 +25,7 @@ public class CustomAuthenticationProvider {
public Principal authenticate(LoginInfo credentials) throws AuthenticationException, GeneralSecurityException {
String token = credentials.getTicket();
try {
- Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(token);
+ Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(credentials);
return principal;
} catch (NonValidTokenException e) {
e.printStackTrace();
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java
index f73cd75da..e58459ecb 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidator.java
@@ -2,6 +2,7 @@ package eu.eudat.security.validators;
import eu.eudat.entities.UserInfo;
import eu.eudat.exceptions.NonValidTokenException;
+import eu.eudat.models.login.LoginInfo;
import eu.eudat.models.security.Principal;
import java.io.IOException;
@@ -9,6 +10,6 @@ import java.security.GeneralSecurityException;
public interface TokenValidator {
- Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException;
+ Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException;
}
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java
index 0258da90e..1a5fb0878 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java
@@ -3,6 +3,7 @@ package eu.eudat.security.validators;
import eu.eudat.security.validators.facebook.FacebookTokenValidator;
import eu.eudat.security.validators.google.GoogleTokenValidator;
import eu.eudat.security.validators.linkedin.LinkedInTokenValidator;
+import eu.eudat.security.validators.twitter.TwitterTokenValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -43,11 +44,13 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory{
private GoogleTokenValidator googleTokenValidator;
private FacebookTokenValidator facebookTokenValidator;
private LinkedInTokenValidator linkedInTokenValidator;
+ private TwitterTokenValidator twitterTokenValidator;
@Autowired
- public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator,LinkedInTokenValidator linkedInTokenValidator) {
+ public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator,LinkedInTokenValidator linkedInTokenValidator,TwitterTokenValidator twitterTokenValidator) {
this.googleTokenValidator = googleTokenValidator;
this.facebookTokenValidator = facebookTokenValidator;
this.linkedInTokenValidator = linkedInTokenValidator;
+ this.twitterTokenValidator = twitterTokenValidator;
}
public TokenValidator getProvider(LoginProvider provider) {
@@ -58,6 +61,8 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory{
return this.facebookTokenValidator;
case LINKEDIN:
return this.linkedInTokenValidator;
+ case TWITTER:
+ return this.twitterTokenValidator;
default:
throw new RuntimeException("Login Provider Not Implemented");
}
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java
index d8c9e6960..56c51cb71 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java
@@ -7,7 +7,9 @@ import eu.eudat.entities.Credential;
import eu.eudat.entities.UserInfo;
import eu.eudat.entities.UserToken;
import eu.eudat.exceptions.NonValidTokenException;
+import eu.eudat.exceptions.UnauthorisedException;
import eu.eudat.models.criteria.UserInfoCriteria;
+import eu.eudat.models.login.LoginInfo;
import eu.eudat.models.loginprovider.LoginProviderUser;
import eu.eudat.models.security.Principal;
import eu.eudat.security.validators.TokenValidator;
@@ -50,14 +52,15 @@ public class FacebookTokenValidator implements TokenValidator {
}
@Override
- public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException {
- User profile = getFacebookUser(token);
+ public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException {
+ User profile = getFacebookUser(credentials.getTicket());
LoginProviderUser user = new LoginProviderUser();
+ if(profile.getEmail() == null ) throw new UnauthorisedException("Cannot login user.Facebook account did not provide email");
user.setEmail(profile.getEmail());
user.setIsVerified(profile.isVerified());
user.setName(profile.getName());
user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK);
- user.setSecret(token);
+ user.setSecret(credentials.getTicket());
return this.authenticationService.Touch(user);
}
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java
index e81a58eae..64dcec9b8 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java
@@ -61,12 +61,12 @@ public class GoogleTokenValidator implements TokenValidator {
}
@Override
- public eu.eudat.models.security.Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException {
+ public eu.eudat.models.security.Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException {
- GoogleIdToken idToken = this.verifyUserAndGetUser(token);
+ GoogleIdToken idToken = this.verifyUserAndGetUser(credentials.getTicket());
Payload payload = idToken.getPayload();
LoginProviderUser user = new LoginProviderUser();
- user.setSecret(token);
+ user.setSecret(credentials.getTicket());
user.setProvider(TokenValidatorFactoryImpl.LoginProvider.GOOGLE);
user.setName((String)payload.get("name"));
user.setEmail(payload.getEmail());
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java
index 2bbb829dd..502f79f6d 100644
--- a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java
@@ -1,6 +1,8 @@
package eu.eudat.security.validators.linkedin;
import eu.eudat.exceptions.NonValidTokenException;
+import eu.eudat.exceptions.UnauthorisedException;
+import eu.eudat.models.login.LoginInfo;
import eu.eudat.models.loginprovider.LoginProviderUser;
import eu.eudat.models.security.Principal;
import eu.eudat.security.validators.TokenValidator;
@@ -31,21 +33,24 @@ public class LinkedInTokenValidator implements TokenValidator {
private LinkedInServiceProvider linkedInServiceProvider;
@Autowired
- public LinkedInTokenValidator(Environment environment,ApiContext apiContext,AuthenticationService authenticationService) {
+ public LinkedInTokenValidator(Environment environment, ApiContext apiContext, AuthenticationService authenticationService) {
this.environment = environment;
- this.apiContext= apiContext;
+ this.apiContext = apiContext;
this.authenticationService = authenticationService;
this.linkedInServiceProvider = new LinkedInServiceProvider(this.environment.getProperty("linkedin.login.clientId"), this.environment.getProperty("linkedin.login.clientSecret"));
}
+
@Override
- public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException {
- AccessGrant accessGrant =this.linkedInServiceProvider.getOAuthOperations().exchangeForAccess(token,"http://localhost:4200/login/linkedin",null);
+ public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException {
+ AccessGrant accessGrant = this.linkedInServiceProvider.getOAuthOperations().exchangeForAccess(credentials.getTicket(), this.environment.getProperty("linkedin.login.redirect_uri"), null);
LinkedIn linkedInService = this.linkedInServiceProvider.getApi(accessGrant.getAccessToken());
LinkedInProfile linkedInProfile = linkedInService.profileOperations().getUserProfile();
LoginProviderUser user = new LoginProviderUser();
+
+ if (user.getEmail() == null) throw new UnauthorisedException("Cannot login user.LinkedIn account did not provide email");
user.setEmail(linkedInProfile.getEmailAddress());
user.setIsVerified(true); //TODO
- user.setName(linkedInProfile.getFirstName()+" "+linkedInProfile.getLastName());
+ user.setName(linkedInProfile.getFirstName() + " " + linkedInProfile.getLastName());
user.setProvider(TokenValidatorFactoryImpl.LoginProvider.LINKEDIN);
user.setSecret(accessGrant.getAccessToken());
return this.authenticationService.Touch(user);
diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java
new file mode 100644
index 000000000..136e86fd6
--- /dev/null
+++ b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java
@@ -0,0 +1,71 @@
+package eu.eudat.security.validators.twitter;
+
+import eu.eudat.exceptions.NonValidTokenException;
+import eu.eudat.exceptions.UnauthorisedException;
+import eu.eudat.models.login.LoginInfo;
+import eu.eudat.models.loginprovider.LoginProviderUser;
+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.linkedin.api.LinkedIn;
+import org.springframework.social.linkedin.api.LinkedInProfile;
+import org.springframework.social.linkedin.connect.LinkedInServiceProvider;
+import org.springframework.social.oauth1.AuthorizedRequestToken;
+import org.springframework.social.oauth1.OAuthToken;
+import org.springframework.social.oauth2.AccessGrant;
+import org.springframework.social.twitter.api.TwitterProfile;
+import org.springframework.social.twitter.api.impl.TwitterTemplate;
+import org.springframework.social.twitter.connect.TwitterServiceProvider;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.Map;
+
+/**
+ * Created by ikalyvas on 1/11/2018.
+ */
+@Component("twitterTokenValidator")
+public class TwitterTokenValidator implements TokenValidator {
+
+ private Environment environment;
+ private ApiContext apiContext;
+ private AuthenticationService authenticationService;
+ private TwitterServiceProvider twitterServiceProvider;
+
+ @Autowired
+ public TwitterTokenValidator(Environment environment, ApiContext apiContext, AuthenticationService authenticationService) {
+ this.environment = environment;
+ this.apiContext = apiContext;
+ this.authenticationService = authenticationService;
+ this.twitterServiceProvider = new TwitterServiceProvider(this.environment.getProperty("twitter.login.clientId"), this.environment.getProperty("twitter.login.clientSecret"));
+ }
+
+ @Override
+ public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException {
+ String verifier = (String) credentials.getData();
+ OAuthToken oAuthToken = new OAuthToken(credentials.getTicket(),verifier);
+ AuthorizedRequestToken authorizedRequestToken = new AuthorizedRequestToken(oAuthToken,verifier);
+ OAuthToken finalOauthToken = this.twitterServiceProvider.getOAuthOperations().exchangeForAccessToken(authorizedRequestToken,null);
+ TwitterTemplate twitterTemplate = new TwitterTemplate(this.environment.getProperty("twitter.login.clientId"), this.environment.getProperty("twitter.login.clientSecret"),finalOauthToken.getValue(),finalOauthToken.getSecret());
+ TwitterProfile profile = this.twitterServiceProvider.getApi(finalOauthToken.getValue(),finalOauthToken.getSecret()).userOperations().getUserProfile();
+ LoginProviderUser user = new LoginProviderUser();
+
+ Map values = twitterTemplate.getRestTemplate().getForObject("https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true", Map.class);
+ if(values.get("email") == null) throw new UnauthorisedException("Cannot login user.Twitter account did not provide email");
+ user.setEmail((String) values.get("email"));
+ user.setIsVerified(true); //TODO
+ user.setName(profile.getName());
+ user.setProvider(TokenValidatorFactoryImpl.LoginProvider.TWITTER);
+ user.setSecret(finalOauthToken.getValue());
+ return this.authenticationService.Touch(user);
+ }
+
+ public OAuthToken getRequestToken() {
+ return this.twitterServiceProvider.getOAuthOperations().fetchRequestToken(this.environment.getProperty("twitter.login.redirect_uri"), null);
+ }
+}
diff --git a/dmp-backend/src/main/resources/application.properties b/dmp-backend/src/main/resources/application.properties
index b3f2a4757..9ac4a6613 100644
--- a/dmp-backend/src/main/resources/application.properties
+++ b/dmp-backend/src/main/resources/application.properties
@@ -35,9 +35,15 @@ facebook.login.clientSecret = 522a847f05c873d0222c85109e24f55a
facebook.login.namespace = eudat
########################GOOGLE LOGIN Properties#############################
google.login.clientId = 524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com
-########################LINKEDIN LOGIN Properties#############################
+########################LINKEDIN LOGIN Properties#############################HiR4hQH9HNubKC5iKQy0l4mAZ
linkedin.login.clientId = 86bl8vfk77clh9
linkedin.login.clientSecret = 2OCO9e3wKylW05Tt
+linkedin.login.redirect_uri = 2OCO9e3wKylW05Tt
+
+########################LINKEDIN LOGIN Properties#############################
+twitter.login.clientId = HiR4hQH9HNubKC5iKQy0l4mAZ
+twitter.login.clientSecret = 9KZHgkqUO2QFnELSL14jeUvfUacWX23rqD8OW8X0xoRDXOSfKH
+twitter.login.redirect_uri = http://localhost:4200/login/twitter
########################Persistence/Hibernate/Batch##############################
#persistence.hibernate.jdbc.batch_size = 30
#persistence.hibernate.order_inserts = true
diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts
index 40b1cc6c0..0709ef467 100644
--- a/dmp-frontend/src/app/app.module.ts
+++ b/dmp-frontend/src/app/app.module.ts
@@ -101,7 +101,8 @@ import { AutocompleteComponent } from './shared/components/autocomplete/autocomp
LoginOptions.facebookOauth,
LoginOptions.googleOauth,
LoginOptions.nativeLogin,
- LoginOptions.linkedInOauth
+ LoginOptions.linkedInOauth,
+ LoginOptions.twitterOauth
],
facebookConfiguration: { clientId: "110586756143149" },
googleConfiguration: { clientId: '524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com' },
@@ -111,7 +112,8 @@ import { AutocompleteComponent } from './shared/components/autocomplete/autocomp
redirectUri: HostConfiguration.App + "login/linkedin",
accessTokenUri: "https://www.linkedin.com/oauth/v2/accessToken",
clientSecret: "2OCO9e3wKylW05Tt"
- }
+ },
+ twitterConfiguration: { clientId: "HiR4hQH9HNubKC5iKQy0l4mAZ", oauthUrl: "https://api.twitter.com/oauth/authenticate" }
}),
HttpModule,
HttpClientModule,
diff --git a/dmp-frontend/src/app/models/login/LoginInfo.ts b/dmp-frontend/src/app/models/login/LoginInfo.ts
index 26d96ba25..6e18cdf70 100644
--- a/dmp-frontend/src/app/models/login/LoginInfo.ts
+++ b/dmp-frontend/src/app/models/login/LoginInfo.ts
@@ -8,4 +8,5 @@ export enum LoginProviders {
export class LoginInfo {
public ticket: string;
public provider: LoginProviders;
+ public data?: any;
}
diff --git a/dmp-frontend/src/app/user-management/login.module.ts b/dmp-frontend/src/app/user-management/login.module.ts
index 250127327..6527007ec 100644
--- a/dmp-frontend/src/app/user-management/login.module.ts
+++ b/dmp-frontend/src/app/user-management/login.module.ts
@@ -1,3 +1,4 @@
+import { TwitterLoginComponent } from './login/twitter-login/twitter-login.component';
import { SnackBarNotificationComponent } from '../shared/components/notificaiton/snack-bar-notification.component';
import { LinkedInLoginComponent } from './login/linkedin-login/linkedin-login.component';
import { LoginRoutes } from './login.routes';
@@ -17,11 +18,13 @@ import { CommonModule } from '@angular/common';
],
declarations: [
LoginComponent,
- LinkedInLoginComponent
+ LinkedInLoginComponent,
+ TwitterLoginComponent
],
exports: [
LoginComponent,
- LinkedInLoginComponent
+ LinkedInLoginComponent,
+ TwitterLoginComponent
],
providers: [LoginService]
})
diff --git a/dmp-frontend/src/app/user-management/login.routes.ts b/dmp-frontend/src/app/user-management/login.routes.ts
index 756ce2429..67cd0ea80 100644
--- a/dmp-frontend/src/app/user-management/login.routes.ts
+++ b/dmp-frontend/src/app/user-management/login.routes.ts
@@ -1,11 +1,12 @@
+import { TwitterLoginComponent } from './login/twitter-login/twitter-login.component';
import { LinkedInLoginComponent } from './login/linkedin-login/linkedin-login.component';
import { LoginComponent } from './login/login.component';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
- { path: '', component: LoginComponent },
- { path: 'linkedin', component: LinkedInLoginComponent }
-
+ { path: 'login', component: LoginComponent },
+ { path: 'login/linkedin', component: LinkedInLoginComponent },
+ { path: 'login/twitter', component: TwitterLoginComponent }
];
export const LoginRoutes = RouterModule.forChild(routes);
diff --git a/dmp-frontend/src/app/user-management/login/login.component.html b/dmp-frontend/src/app/user-management/login/login.component.html
index 92a68f384..2bc1f7de0 100644
--- a/dmp-frontend/src/app/user-management/login/login.component.html
+++ b/dmp-frontend/src/app/user-management/login/login.component.html
@@ -15,7 +15,7 @@
-