2016-12-01 1 views
0

私はakka-httpを使ってREST APIをビルドしています。 (私はREST Webサービスを構築するために新しいです)。 セッションを使用せずにクッキーを取得して設定する方法がわかりません。このCookieには、暗号化トークンアクセスが含まれている必要があります。私はプレイやスプレーを使用しません。 一瞬のための私のコードは次のとおりです。リンクされたAPI用のAkka-http&scribe:セッションなしでクッキーを設定/取得する(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。あなたの応答では、ヘッダーを含めることができます。あなたの場合は、リダイレクトでそれほど簡単ではないかもしれません。しかし、署名ヘッダーがoauth2認証サーバーを指している308 Httpコードを返す署名要求を完了することができます。

+0

ご回答ありがとうございます。 どういう意味ですか?リダイレクトは良い方法ではありませんか?私はそれがScribeの役割だと思った。 –

+0

リダイレクト機能は30xコードで応答を作成する。ヘッダー "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)) 
      )) 
      } 
      } 
     } 
関連する問題