我的堆栈,尽管我认为不一定相关,但后端是akka http,前端是scala.js。
我想使用谷歌日历api对我的应用执行各种操作,只要我直接访问路径,我的第一个测试就可以工作,但是现在我想真正地使其在多层环境中工作,因此,我想通过客户端中的ajax调用来调用我的路径。我的理解是,浏览器上的ajax调用会自动处理所需的任何重定向,而且由于Google需要一个实际的屏幕来完成身份验证工作,因此这显然行不通。
我的问题特别是当访问 my 服务器的访问Google api的调用发生在ajax上下文中时,如何管理google auth。
我在akka的路线如下:
path("googleLogin2") {
get {
parameters('code.as[String]) { code => {
val cal = GoogleCalendar(session.user.account)
val flow = cal.flow
val tokResponse = flow
.newTokenRequest(code)
.setRedirectUri("http://localhost:8083/googleLogin2")
.execute();
flow.createAndStoreCredential(tokResponse, session.user.account.name)
complete("good")
}
}
}
} ~
path("googleLogin1") {
get {
val cal = GoogleCalendar(session.user.account)
val flow = cal.flow
val credential = flow.loadCredential(session.user.account.name)
if (credential != null &&
(credential.getRefreshToken() != null ||
credential.getExpiresInSeconds() == null ||
credential.getExpiresInSeconds() > 60)) {
//All good
complete {
None
}
} else {
val url =
flow
.newAuthorizationUrl
.setRedirectUri("http://localhost:8083/googleLogin2")
.build()
redirect(url, StatusCodes.Found)
}
}
}
我的scala.js看起来像这样:
Ajax.get(s"http://localhost:8083/googleLogin1")