2017-04-01 3 views
0

J'ai une application Play qui permet aux utilisateurs de se connecter avec des fournisseurs sociaux, et d'avoir une authentification identique à l'exemple de graine Play-Silhouette-Slick. Le code suivant est probablement bien, mais je l'ai inclus quand même.Stateless Stateless CookieAuthenticator ne peut pas trouver/supprimer le 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")) 
    } 
} 

Mon problème est que lorsqu'un utilisateur se connecte, les points d'extrémité de mon application ne parviennent pas à détecter que l'utilisateur est connecté. Quand je redirigés vers la page immédiatement après la connexion, je peux vérifier dans Firefox que l'authentificateur cookie est défini, mais dès que je navigue vers une autre page de mon application, le cookie n'est plus présent.

Je suppose que mon application pense que le cookie est invalide ou quelque chose, puis le supprime, mais je n'ai actuellement aucune idée. Y at-il une autre raison pour laquelle cela pourrait se produire? Comment dois-je enregistrer mon application pour réduire le problème?

Répondre

1

Je suggérerais que votre cookie a expiré.

Vous pouvez configurer ceci dans CookieAuthenticatorSettings, dans lequel cookieMaxAge est défini sur None, ce qui signifie que le cookie résultant est transitoire.

+0

Malheureusement, c'était pas. :( – rusins

+0

Qu'en est-il du chemin du cookie? – mavarazy

+0

J'ai le chemin de cookie mis à "/", comme il se doit. – rusins

0

Mon ensemble d'injection de dépendances était incorrect. Je n'avais pas supprimé la ligne liant l'horloge du fuseau horaire local en tant qu'instance d'horloge, je suppose que les modules silhouette utilisaient l'horloge incorrecte. J'ai maintenant cette ligne:

bind[Clock].toInstance(Clock()) 

et enlevé cette ligne:

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