2016-12-01 4 views
0

Ich verwende akka-http für den Aufbau einer REST-API. (Ich bin neu beim Erstellen von REST-Webdiensten). Ich weiß nicht, wie ich Cookies erhalten und setzen kann, ohne eine Sitzung zu benutzen. Dieser Cookie muss den Verschlüsselungs-Token-Zugriff enthalten. Ich benutze weder Play noch Spray. Mein Code für den Moment ist:Akka-http & scribe für linkedin API: set/get cookie ohne session (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 

Antwort

0

Überprüfen Sie die akka doc. In Ihrer Antwort können Sie die Überschrift einfügen. In deinem Fall ist es vielleicht mit Redirect nicht so einfach. Aber Sie könnten die Signierungsanforderung abschließen, indem Sie einen 308 Http-Code zurücksenden, wobei der Location Header auf Ihren oauth2 Auth-Server zeigt.

+0

Danke für Ihre Antwort. Was meinst du? Weiterleitung ist kein guter Weg? Ich dachte, das war die Aufgabe von Scribe, das zu tun –

+0

Die Redirect-Funktion erstellt eine Antwort mit einem 30x-Code. Wenn Sie den Header "Set-cookie" hinzufügen möchten, ist es besser, die Antwort "manuell" zu erstellen und stattdessen redirect aufzurufen. – EmiCareOfCell44

0

Ist es besser?

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)) 
      )) 
      } 
      } 
     }