Scala Steam-OpenId和Play框架

Scala Steam-OpenId和Play框架,scala,playframework,openid,steam,Scala,Playframework,Openid,Steam,我在使用Steam作为OpenId提供程序时遇到问题。在对我的站点进行回调之前,一切都正常,我看到了steam登录网页,我可以使用我的用户登录,但是当执行calback时,我得到了一个异常。 我使用Play2.2和Scala。该代码与上的代码非常相似 堆栈跟踪: Internal server error, for (GET) [/steam/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=er

我在使用Steam作为OpenId提供程序时遇到问题。在对我的站点进行回调之前,一切都正常,我看到了steam登录网页,我可以使用我的用户登录,但是当执行calback时,我得到了一个异常。 我使用Play2.2和Scala。该代码与上的代码非常相似

堆栈跟踪:

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]
Internal server error,for(GET)[/steam/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=error&openid.error=Invalid+claid\u id+或+identity]>
play.api.Application$$anon$1:执行异常[[BAD_RESPONSE$:null]]
在play.api.Application$class.handleError(Application.scala:293)~[play_2.10.jar:2.2.1]
play.api.DefaultApplication.handleError(Application.scala:399)[play_2.10.jar:2.2.1]
在play.core.server.netty.playdaultUpstreamHandler$$anonfun$12$$anonfun$apply$1.applyOrElse(playdaultUpstreamHandler.scala:165)[play_2.10.jar:2.2.1]
在play.core.server.netty.playdaultUpstreamHandler$$anonfun$12$$anonfun$apply$1.applyOrElse(playdaultUpstreamHandler.scala:162)[play_2.10.jar:2.2.1]
在scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)[scala-library-2.10.3.jar:na]
在scala.util.Failure$$anonfun$recover$1.apply(Try.scala:185)[scala-library-2.10.3.jar:na]
原因:play.api.libs.openid.Errors$BAD\u RESPONSE$:null
在play.api.libs.openid.Errors$BAD_RESPONSE$(OpenIDError.scala)~[play_2.10.jar:2.2.1]
在play.api.libs.openid.OpenIDClient.verifiedId(openid.scala:111)~[play_2.10.jar:2.2.1]
在play.api.libs.openid.OpenIDClient.verifiedId(openid.scala:92)~[play_2.10.jar:2.2.1]
在controllers.Application$$anonfun$openIDCallback$1.apply(Application.scala:29)~[classes/:2.2.1]
在controllers.Application$$anonfun$openIDCallback$1.apply(Application.scala:28)~[classes/:2.2.1]
在play.api.mvc.Action$.invokeBlock(Action.scala:357)~[play_2.10.jar:2.2.1]
我在返回的URL中看到此错误消息
openid.error=Invalid+claid\u id+或+identity
,但找不到任何相关信息


我错过了什么?谢谢。

这是因为Play Framework OpenID类没有正确生成重定向URL。从代码中的此行打印出
url
变量的值:

.map(url => Redirect(url))
很可能是这样的:

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
根据OpenID 2.0规范,这是不正确的,特别是在:

如果最终用户输入了OpenID提供程序(OP)标识符,则没有声明的标识符。为了发出OpenID身份验证请求,输入OP标识符时,必须将值“”用作声明的标识符和OP本地标识符

基于此,生成的重定向
url
变量应该是:

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
我已经在Play Framework问题跟踪器上为此编写了一个问题:

同时,作为临时破解/修复,您可以在
url
变量上使用任意数量的字符串替换技术,将
openid.claid\u id
openid.identity
参数设置为正确的
http://specs.openid.net/auth/2.0/identifier_select
value

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