2017-04-01 84 views
0

我有一個Play應用程序,允許用戶使用社交提供程序登錄,並將身份驗證設置爲與Play-Silhouette-Slick種子示例相同。下面的代碼可能很好,但我仍然將它包括在內。Stateless Silhouette CookieAuthenticator無法找到/刪除Cookie

def authenticate(provider: String): Action[AnyContent] = Action.async { implicit request => 
(socialProviderRegistry.get[SocialProvider](provider) match { 
    case Some(provider: SocialProvider with CommonSocialProfileBuilder) => 
    provider.authenticate().flatMap { 
     case Left(result) => Future.successful(result) // Redirect user to social provider 
     case Right(authInfo) => for { 
     profile <- provider.retrieveProfile(authInfo) 
     user <- userService.save(profile) 
     authInfo <- authInfoRepository.save(profile.loginInfo, authInfo) 
     authenticator <- silhouette.env.authenticatorService.create(profile.loginInfo) 
     cookie <- silhouette.env.authenticatorService.init(authenticator) 
     result <- silhouette.env.authenticatorService.embed(cookie, Redirect(routes.EateriesController.eaterySelection())) 
     } yield { 
     silhouette.env.eventBus.publish(LoginEvent(user, request)) 
     println("Just to verify that everything went well") 
     result 
     } 
    } 
    case _ => Future.failed(new ProviderException(s"Cannot authenticate with unexpected social provider $provider")) 
}).recover { 
    case e: ProviderException => 
    logger.error("Unexpected provider error", e) 
    Redirect(routes.SignInController.index()).flashing("error" -> Messages("could.not.authenticate")) 
    } 
} 

我的問題是,用戶登錄後,我的應用程序的終結點無法檢測登錄後,用戶已登錄。當我重定向頁面,我可以在Firefox驗證認證Cookie已設置,但只要我導航到我的應用程序中的另一個頁面,則該Cookie不再存在。

我猜我的應用程序認爲該cookie無效或某事,然後刪除它,但我目前沒有線索。有什麼其他原因可能會發生這種情況/我應該如何登錄我的應用程序來縮小問題的範圍?

回答

1

我會建議你的cookie過期。

您可以在CookieAuthenticatorSettings中進行配置,CookieAuthenticatorSettings的cookieMaxAge設置爲None,這意味着生成的Cookie是暫時的。

+0

不幸的是,這不是它。 :( – rusins

+0

Cookie路徑怎麼樣? – mavarazy

+0

我的cookie路徑設置爲「/」,因爲它應該是。 – rusins

0

我有我的依賴注入集錯了。我沒有刪除綁定本地時區時鐘的線作爲時鐘實例,我想讓輪廓模塊使用不正確的時鐘。我現在有這樣一行:

bind[Clock].toInstance(Clock()) 

,並刪除這一行:

bind(classOf[Clock]).toInstance(Clock.systemDefaultZone)