2015-10-16 40 views
2

我已經使用Play2.3斯卡拉開發的網絡插座,我想實現在使用oauth-provider播放斯卡拉網絡插座的oauth2。網絡插座在播放斯卡拉網絡插座的oauth2實施

代碼片段:對於REST服務的oauth2的

object LoginWS { 
    def props(out: ActorRef) = Props(new LoginWS(out)) 
} 

class LoginWS(out: ActorRef) extends Actor { 
    def receive = { 
    case json_req: JsObject => 
     val login_status : String = "Success" 
     out ! Json.toJson(JsObject(Seq("login_status" -> JsString(login_status)))) 
    } 
} 

object WebSocketController extends Controller { 

    def login = WebSocket.acceptWithActor[JsValue, JsValue] { request => 
    out => 
     LoginWS.props(out) 
    } 

} 

代碼片段:

我已經使用了的oauth2實施 「scala-oauth2-provider-slick」 樣本。

trait MyOAuth extends OAuth2Provider { 
    override val tokenEndpoint: TokenEndpoint = MyTokenEndpoint 
} 

object OAuth2Controller extends Controller with MyOAuth { 

    val cats = TableQuery[CatsTable] 
    implicit val catFormat = Json.format[Cat] 

    def accessToken = Action.async { implicit request => 
    issueAccessToken(new Oauth2DataHandler()) 
    } 

    def list = Action.async { implicit request => 
    authorize(new Oauth2DataHandler()) { authInfo => 
     DBAction { implicit rs => 
     Ok(toJson(cats.list)) 
     }.apply(request) 
    } 
    } 
} 

如何在上面的web-socket代碼中實現oauth2?

有人知道,如何實現對上述網絡插座的oauth2?

更新:

我試圖實現的OAuth和網絡插口:

代碼片段:

def login = WebSocket.tryAcceptWithActor[JsValue, JsValue] { request => 
     authorize(new Oauth2DataHandler()) { authInfo => 
     val user = authInfo.user // User is defined on your system 
     println(user.toString()) 
    } 
    } 

得到了以下問題:

1) polymorphic expression cannot be instantiated to expected type; found : [A]scala.concurrent.Future[play.api.mvc.Result] required: Either[play.api.mvc.Result,play.api.mvc.WebSocket.HandlerProps] (which expands to) Either[play.api.mvc.Result,akka.actor.ActorRef ⇒ akka.actor.Props] 

2) type mismatch; found : Unit required: scala.concurrent.Future[play.api.mvc.Result] 

回答

1

OAuth2Provider提供protectedResource情況下,這樣你就可以直接調用你的WebSocket控制器授權的handleRequest方法。 客戶端通過HTTP頭或查詢參數發送訪問令牌。

我建議你使用tryAcceptWithActor這一翻譯acceptWithActor。 因爲如果用戶發送無效的訪問令牌,則需要返回錯誤的請求。

object LoginWS { 
    def props(user: User)(out: ActorRef) = Props(new LoginWS(user, out)) 
} 

object WebSocketController extends Controller extends MyOAuth { 

    def login = WebSocket.tryAcceptWithActor[JsValue, JsValue] { request => 
    Future.successful { 
     (protectedResource.handleRequest(request, new Oauth2DataHandler())).map { 
     case Left(e) => e match { 
      case e: OAuthError if e.statusCode == 400 => Left(BadRequest.withHeaders(responseOAuthErrorHeader(e))) 
      case e: OAuthError if e.statusCode == 401 => Left(Unauthorized.withHeaders(responseOAuthErrorHeader(e))) 
     } 
     case Right(authInfo) => Right(LoginWS.props(authInfo.user) _) 
     } 
    } 
    } 
} 

我不確定這段代碼是否可以編譯。 但我用這個庫編寫了類似的代碼。

+0

感謝您的答覆。當我添加這一行時,我得到了「方法映射沒有足夠的參數:(隱式執行程序:scala.concurrent.ExecutionContext)scala.concurrent.Future [帶有可序列化的產品與scala.util.Etil [play.api.mvc.Result ,akka.actor.ActorRef => akka.actor.Props]]。未指定的值參數執行程序。「錯誤。 – SKK

+0

你能否請檢查下面的問題。請幫助我進一步處理。謝謝。 http://stackoverflow.com/q/37183156/1584121 – SKK

+0

如果你有時間,請看看這個問題。謝謝! - http://stackoverflow.com/q/37183156/1584121 – SKK