2014-02-26 2 views
4

OpenId 공급자로 Steam을 사용하는 데 문제가 있습니다. 내 사이트에 콜백이 생길 때까지 모든 것이 잘 작동하고, 스팀 로그인 웹 페이지가 표시되며 내 사용자와 로그인 할 수 있지만 콜백이 실행되면 예외가 발생합니다. 나는 2.2와 스칼라를 사용합니다. 이 코드는 play docsSteam OpenId 및 Play Framework

def loginPost = Action.async { implicit request => 
    OpenID.redirectURL("http://steamcommunity.com/openid", 
     routes.Application.openIDCallback.absoluteURL(), 
     realm = Option("http://mydomain.com/")) 
     .map(url => Redirect(url)) 
     .recover { case error => Redirect(routes.Application.login) } 
    } 

    def openIDCallback = Action.async { implicit request => 
     OpenID.verifiedId.map(info => Ok(info.id + "\n" + info.attributes)) 
     .recover { 
      case error => 
      println(error.getMessage()) //prints null 
      Redirect(routes.Application.login) 
     } 
    } 

스택 트레이스에있는 것과 매우 유사하다 : 나는 반환 된 URL에이 오류 메시지가 openid.error=Invalid+claimed_id+or+identity를 볼 수 있지만 관련된 아무것도 찾을 수 couldnt는

Internal server error, for (GET) [/steam/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=error&openid.error=Invalid+claimed_id+or+identity] -> 

play.api.Application$$anon$1: Execution exception[[BAD_RESPONSE$: null]] 
    at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10.jar:2.2.1] 
    at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10.jar:2.2.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$12$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:165) [play_2.10.jar:2.2.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$12$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:162) [play_2.10.jar:2.2.1] 
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) [scala-library-2.10.3.jar:na] 
    at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185) [scala-library-2.10.3.jar:na] 
Caused by: play.api.libs.openid.Errors$BAD_RESPONSE$: null 
    at play.api.libs.openid.Errors$BAD_RESPONSE$.<clinit>(OpenIDError.scala) ~[play_2.10.jar:2.2.1] 
    at play.api.libs.openid.OpenIDClient.verifiedId(OpenID.scala:111) ~[play_2.10.jar:2.2.1] 
    at play.api.libs.openid.OpenIDClient.verifiedId(OpenID.scala:92) ~[play_2.10.jar:2.2.1] 
    at controllers.Application$$anonfun$openIDCallback$1.apply(Application.scala:29) ~[classes/:2.2.1] 
    at controllers.Application$$anonfun$openIDCallback$1.apply(Application.scala:28) ~[classes/:2.2.1] 
    at play.api.mvc.Action$.invokeBlock(Action.scala:357) ~[play_2.10.jar:2.2.1] 

.

무엇이 누락 되었습니까? 감사.

답변

0

Play Framework OpenID 클래스가 리디렉션 URL을 제대로 생성하지 못하기 때문입니다. 코드에서이 줄에서 url 변수의 값을 인쇄 : http://openid.net/specs/openid-authentication-2_0.html#discovered_info에서 특히,

https://steamcommunity.com/openid/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.mode=checkid_setup 
&openid.claimed_id=http%3A%2F%2Fsteamcommunity.com%2Fopenid 
&openid.identity=http%3A%2F%2Fsteamcommunity.com%2Fopenid 
&openid.return_to=http%3A%2F%2Fwww.mydomain.com%2Fsteam%2Flogin 
&openid.realm=http%3A%2F%2Fwww.mydomain.com 

이것은 오픈 ID 2.0 스펙 당 올바르지 않습니다

.map(url => Redirect(url)) 

그것은 대부분 다음과 같은 :

최종 사용자가 OPID (OpenID Provider) 식별자를 입력 한 경우 클레임 식별자가 없습니다. OpenID 인증 요청을하기 위해 OP 식별자가 입력되면 값 "http://specs.openid.net/auth/2.0/identifier_select"을 소유권이 주장 된 식별자와 OP-Local Identifier로 사용해야합니다. 그 바탕으로

, 생성 된 리디렉션 url 변수 해야한다 :

https://github.com/playframework/playframework/issues/3740

: 나는 플레이 프레임 워크 이슈 트래커에 대한 문제를 작성했습니다

https://steamcommunity.com/openid/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.mode=checkid_setup 
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.return_to=http%3A%2F%2Fwww.mydomain.com%2Fsteam%2Flogin 
&openid.realm=http%3A%2F%2Fwww.mydomain.com 

그 동안 임시 해킹/수정으로 귀하의에서 임의의 수의 문자열 교체 기술을 사용할 수 있습니다변수를 사용하여 openid.claimed_idopenid.identity 매개 변수를 올바른 http://specs.openid.net/auth/2.0/identifier_select 값으로 설정하십시오.