From 47b3f422719960df21fc829b8a1868f47cc3c794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Wed, 16 Jan 2019 13:11:31 +0100 Subject: [PATCH] OAuth2 Google - done --- src/main/scala/code/api/GatewayLogin.scala | 2 +- src/main/scala/code/api/OAuth2.scala | 18 +++++++++++++++--- .../code/remotedata/RemotedataUsers.scala | 4 ++-- .../code/remotedata/RemotedataUsersActor.scala | 6 +++--- src/main/scala/code/users/LiftUsers.scala | 10 +++++----- src/main/scala/code/users/Users.scala | 4 ++-- 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/scala/code/api/GatewayLogin.scala b/src/main/scala/code/api/GatewayLogin.scala index 02ec48602..ca385a578 100755 --- a/src/main/scala/code/api/GatewayLogin.scala +++ b/src/main/scala/code/api/GatewayLogin.scala @@ -304,7 +304,7 @@ object GatewayLogin extends RestHelper with MdcLoggable { } case Full((s, accounts, callContextNew)) if getErrors(s).forall(_.equalsIgnoreCase("")) => // CBS returned response without any error logger.debug("CBS returned proper response") - Users.users.vend.getOrCreateUserByProviderIdFuture(provider = gateway, idGivenByProvider = username) map { + Users.users.vend.getOrCreateUserByProviderIdFuture(provider = gateway, idGivenByProvider = username, name = None, email = None) map { case Full(u) => val isFirst = getFieldFromPayloadJson(jwtPayload, "is_first") // Update user account views, only when is_first == true in the GatewayLogin token's payload . diff --git a/src/main/scala/code/api/OAuth2.scala b/src/main/scala/code/api/OAuth2.scala index 7f22771da..8b85b03a2 100644 --- a/src/main/scala/code/api/OAuth2.scala +++ b/src/main/scala/code/api/OAuth2.scala @@ -151,6 +151,13 @@ object OAuth2Handshake extends RestHelper with MdcLoggable { } object Google { + private def getClaim(name: String, idToken: String): Option[String] = { + val claim = JwtUtil.getClaim(name = name, jwtToken = idToken).asString() + claim match { + case null => None + case string => Some(string) + } + } def isIssuer(jwtToken: String): Boolean = { JwtUtil.getIssuer(jwtToken).map(_.contains("accounts.google.com")).getOrElse(false) } @@ -177,7 +184,12 @@ object OAuth2Handshake extends RestHelper with MdcLoggable { def getOrCreateResourceUserFuture(idToken: String): Future[Box[User]] = { val subject = JwtUtil.getSubject(idToken).getOrElse("") val issuer = JwtUtil.getIssuer(idToken).getOrElse("") - Users.users.vend.getOrCreateUserByProviderIdFuture(provider = issuer, idGivenByProvider = subject) + Users.users.vend.getOrCreateUserByProviderIdFuture( + provider = issuer, + idGivenByProvider = subject, + name = getClaim(name = "name", idToken = idToken).orElse(Some(subject)), + email = getClaim(name = "email", idToken = idToken) + ) } /** Old Style Endpoints * This function creates user based on "iss" and "sub" fields @@ -194,8 +206,8 @@ object OAuth2Handshake extends RestHelper with MdcLoggable { Users.users.vend.createResourceUser( // Otherwise create a new one provider = issuer, providerId = Some(subject), - name = Some(subject), - email = None, + name = getClaim(name = "name", idToken = idToken).orElse(Some(subject)), + email = getClaim(name = "email", idToken = idToken), userId = None ) } diff --git a/src/main/scala/code/remotedata/RemotedataUsers.scala b/src/main/scala/code/remotedata/RemotedataUsers.scala index 7de9a6fc6..4252adcba 100644 --- a/src/main/scala/code/remotedata/RemotedataUsers.scala +++ b/src/main/scala/code/remotedata/RemotedataUsers.scala @@ -35,8 +35,8 @@ object RemotedataUsers extends ObpActorInit with Users { def getUserByProviderIdFuture(provider : String, idGivenByProvider : String) : Future[Box[User]] = (actor ? cc.getUserByProviderIdFuture(provider, idGivenByProvider)).mapTo[Box[User]] - def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String) : Future[Box[User]] = - (actor ? cc.getOrCreateUserByProviderIdFuture(provider, idGivenByProvider)).mapTo[Box[User]] + def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) : Future[Box[User]] = + (actor ? cc.getOrCreateUserByProviderIdFuture(provider, idGivenByProvider, name, email)).mapTo[Box[User]] def getUserByUserId(userId : String) : Box[User] = getValueFromFuture( (actor ? cc.getUserByUserId(userId)).mapTo[Box[User]] diff --git a/src/main/scala/code/remotedata/RemotedataUsersActor.scala b/src/main/scala/code/remotedata/RemotedataUsersActor.scala index db5160caf..58da10b4a 100644 --- a/src/main/scala/code/remotedata/RemotedataUsersActor.scala +++ b/src/main/scala/code/remotedata/RemotedataUsersActor.scala @@ -36,9 +36,9 @@ class RemotedataUsersActor extends Actor with ObpActorHelper with MdcLoggable { logger.debug("getUserByProviderIdFuture(" + provider +"," + idGivenByProvider +")") sender ! (mapper.getUserByProviderId(provider, idGivenByProvider)) - case cc.getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String) => - logger.debug("getOrCreateUserByProviderIdFuture(" + provider +"," + idGivenByProvider +")") - sender ! (mapper.getOrCreateUserByProviderId(provider, idGivenByProvider)) + case cc.getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) => + logger.debug("getOrCreateUserByProviderIdFuture(" + provider +"," + idGivenByProvider + name + email +")") + sender ! (mapper.getOrCreateUserByProviderId(provider, idGivenByProvider, name, email)) case cc.getUserByUserId(userId: String) => logger.debug("getUserByUserId(" + userId +")") diff --git a/src/main/scala/code/users/LiftUsers.scala b/src/main/scala/code/users/LiftUsers.scala index 67e2e535d..be43dede9 100644 --- a/src/main/scala/code/users/LiftUsers.scala +++ b/src/main/scala/code/users/LiftUsers.scala @@ -42,20 +42,20 @@ object LiftUsers extends Users with MdcLoggable{ } } - def getOrCreateUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = { + def getOrCreateUserByProviderId(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) : Box[User] = { Users.users.vend.getUserByProviderId(provider = provider, idGivenByProvider = idGivenByProvider).or { // Find a user Users.users.vend.createResourceUser( // Otherwise create a new one provider = provider, providerId = Some(idGivenByProvider), - name = Some(idGivenByProvider), - email = None, + name = name, + email = email, userId = None ) } } - def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String) : Future[Box[User]] = { + def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) : Future[Box[User]] = { Future { - getOrCreateUserByProviderId(provider, idGivenByProvider) + getOrCreateUserByProviderId(provider, idGivenByProvider, name, email) } } diff --git a/src/main/scala/code/users/Users.scala b/src/main/scala/code/users/Users.scala index 73e2c45b5..eaac05368 100644 --- a/src/main/scala/code/users/Users.scala +++ b/src/main/scala/code/users/Users.scala @@ -33,7 +33,7 @@ trait Users { def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] def getUserByProviderIdFuture(provider : String, idGivenByProvider : String) : Future[Box[User]] - def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String) : Future[Box[User]] + def getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) : Future[Box[User]] //resourceuser has two ids: id(Long)and userid_(String), this method use userid_(String) def getUserByUserId(userId : String) : Box[User] @@ -68,7 +68,7 @@ class RemotedataUsersCaseClasses { case class getResourceUserByResourceUserIdFuture(id : Long) case class getUserByProviderId(provider : String, idGivenByProvider : String) case class getUserByProviderIdFuture(provider : String, idGivenByProvider : String) - case class getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String) + case class getOrCreateUserByProviderIdFuture(provider : String, idGivenByProvider : String, name: Option[String], email: Option[String]) case class getUserByUserId(userId : String) case class getUserByUserIdFuture(userId : String) case class getUsersByUserIdsFuture(userId : List[String])