2016-12-01 2 views
0

Я использую akka-http для создания REST API. (Я новичок в создании веб-сервисов REST). Я не знаю, как я могу получить и установить cookie без использования сеанса. Этот файл cookie должен содержать доступ к токенам шифрования. Я не использую Play или спрей. Мой код на данный момент является:Akka-http & scribe для linkedin API: set/get cookie без сеанса (scala)

lazy val signin = path("signin") { 
      get { 

      /* create the OAuthService object with a callback URL*/ 
      val service = buildService() 

      /* get the request token*/ 
      val requestToken = service.getRequestToken 

      /* create the cookie */ 
      val jwtCookieEncrypted = tokenUtil.createLinkedinTokenSecret(requestToken) 
      val cookie = HttpCookie("jwtTokenCookie", jwtCookieEncrypted) 

      /* making the user validate our requestToken by redirecting him to the following URL*/ 
      val authURL = service.getAuthorizationUrl(requestToken) 
      redirect(authURL, StatusCodes.TemporaryRedirect) 

      } 

     } 

lazy val callback = path("callback") { 

      // extract cookie with the jwtTokenCookie name 
      cookie("jwtTokenCookie") { cookiePair => 
      complete(s"The logged in user is '${cookiePair.name}'") 
      } 
      get { 
      parameters('code, 'state) { (code, state) => // must come from cookie and not request parameters 

       /* create the OAuthService object with a callback URL*/ 
       val service = buildService() 

       /* get the request token*/ 
       val requestToken = new Token(code, state) 

       if(state == tokenUtil.decryptLinkedinToken(requestToken.getSecret).getOrElse("")) "continue" else "throw error" 

       val verifier = new Verifier(state) 

       /* get the access token 
       (need to exchange requestToken and verifier for an accessToken which is the one used to sign requests)*/ 
       val accessToken = service.getAccessToken(requestToken, verifier) 

       logger.debug(accessToken.getRawResponse) 

       /* sign request*/ 
       val ResourceUrl = Settings.LinkedIn.ResourceUrl 

       val request = new OAuthRequest(Verb.GET, ResourceUrl) 
       service.signRequest(accessToken, request) 
       val response = request.send 

       if (response.getCode == StatusCodes.OK.intValue) complete(response.getBody) 
       else complete(int2StatusCode(response.getCode)) 
      } 

      } 
     } 

     signin ~ callback 

ответ

0

Проверить Акка doc. В вашем ответе вы можете включить заголовок. В вашем случае, возможно, с перенаправлением это не так просто. Но вы можете выполнить запрос подписи, возвращающий 308 Http-код с заголовком местоположения, указывающим на ваш сервер Autaut2.

+0

Спасибо за ваш ответ. Что это значит? перенаправление - не лучший способ? Я думал, что это роль Scribe для этого. –

+0

Функция перенаправления создает ответ с 30-кратным кодом. Если вы хотите добавить заголовок «Set-cookie», лучше создать ответ «вручную», а не перенаправлять. – EmiCareOfCell44

0

Это лучше?

path("signin") { 
      get { 
      val service = buildService() 
      val requestToken = service.getRequestToken 
      val authURL = service.getAuthorizationUrl(requestToken) 
      val requestTokenCrypted = tokenUtil.createLinkedinToken(requestToken) 
      val cookie = HttpCookie("abcde", requestTokenCrypted.getSecret) 

      setCookie(cookie) { 
       complete(HttpResponse(
       status = StatusCodes.TemporaryRedirect, 
       headers = List(Location(authURL)) 
      )) 
      } 
      } 
     } 
Смежные вопросы