OAuth2 Google - done

This commit is contained in:
Marko Milić 2019-01-16 13:11:31 +01:00
parent 386c40e99b
commit 47b3f42271
6 changed files with 28 additions and 16 deletions

View File

@ -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 .

View File

@ -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
)
}

View File

@ -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]]

View File

@ -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 +")")

View File

@ -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)
}
}

View File

@ -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])