com.emarsys.rdb.connector.bigquery.GoogleTokenApi.scala Maven / Gradle / Ivy
The newest version!
package com.emarsys.rdb.connector.bigquery
import akka.http.scaladsl.HttpExt
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import akka.http.scaladsl.model.{FormData, HttpMethods, HttpRequest}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.Materializer
import com.emarsys.rdb.connector.bigquery.GoogleTokenApi.{AccessTokenExpiry, OAuthResponse}
import pdi.jwt.{Jwt, JwtAlgorithm, JwtClaim, JwtTime}
import spray.json.{DefaultJsonProtocol, RootJsonFormat}
import scala.concurrent.Future
class GoogleTokenApi(http: => HttpExt) {
protected val encodingAlgorithm: JwtAlgorithm.RS256.type = JwtAlgorithm.RS256
private val googleTokenUrl = GoogleApi.googleTokenUrl
private val scope = GoogleApi.bigQueryAuthUrl
def now: Long = JwtTime.nowSeconds
private def generateJwt(clientEmail: String, privateKey: String): String = {
val claim = JwtClaim(content = s"""{"scope":"$scope","aud":"$googleTokenUrl"}""", issuer = Option(clientEmail))
.expiresIn(3600)
.issuedNow
Jwt.encode(claim, privateKey, encodingAlgorithm)
}
def getAccessToken(clientEmail: String, privateKey: String)(
implicit materializer: Materializer
): Future[AccessTokenExpiry] = {
import materializer.executionContext
import SprayJsonSupport._
val expiresAt = now + 3600
val jwt = generateJwt(clientEmail, privateKey)
val requestEntity = FormData(
"grant_type" -> "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion" -> jwt
).toEntity
for {
response <- http.singleRequest(HttpRequest(HttpMethods.POST, googleTokenUrl, entity = requestEntity))
result <- Unmarshal(response.entity).to[OAuthResponse]
} yield {
AccessTokenExpiry(
accessToken = result.access_token,
expiresAt = expiresAt
)
}
}
}
object GoogleTokenApi {
case class AccessTokenExpiry(accessToken: String, expiresAt: Long)
case class OAuthResponse(access_token: String, token_type: String, expires_in: Int)
import DefaultJsonProtocol._
implicit val oAuthResponseJsonFormat: RootJsonFormat[OAuthResponse] = jsonFormat3(OAuthResponse)
}