本站使用 Github 登录似乎坏了?

授权后提示

抱歉,在验证你的帐号时发生了错误。可能你没有批准授权申请?

我自己的站微博登录也是一样的错误,看 /logs 中提示的错误是 redirect_uri mismatch ,但是我在微博后台中填写的确实是 <domain url>/auth/weibo/callback , 求助

现在 GitHub 登录应该正常了。应该是有些更新弄错了 callback url。

确认它正确就好。日志可以在 /logs 里看到。domain url 要注意 https,以及是不是代理的时候传递了端口号

再三确认 url 没有问题,https 也没有问题

错误日志:

(weibo) Authentication failure! invalid_credentials: OAuth2::Error, redirect_uri_mismatch: 
{"error":"redirect_uri_mismatch","error_code":21322,"request":"/oauth2/access_token","error_uri":"/oauth2/access_token"}

微博后台的设置:

discourse 后台 client id 和 secret 也确认过。还有其他地方遗漏么?

p.s. 这个帖子里面的微博设置中网站验证部分已经不需要了,因为我一直通不过网站验证,咨询新浪微博技术支持,他们说现在网站应用已经不需要这一步了。新浪微博的文档以及产品真是烂,都没有了还留着这个入口,验证的时候也没有任何提示,折腾了半天。

国内大厂文档都很烂。我这一度回调地址是 http://xxxx:80/auth/weibo/callback,我记得是 nginx 转发的问题。请务必保持你 Discourse 容器是最新,且如果有反向代理,转发地址是正确的。你可以查看 Nginx 的日志。

跟你问题无关,但正确的错误回调页面是 /auth/failure

之前设的是这个,后来看新浪微博那边说的是取消授权,而不是错误回调页,所以就改了。不过似乎这个关系不大,和这个问题没关系。

关于 nginx 转发设置我再排查一下看看,多谢提醒

试了半天还是不行,初步定位了一下问题所在。

第一次请求微博 /oauth2/authorize 这一步没有问题。并且如果把微博后台的回调地址改写成别的,这一步就成功不了,所以排除了在微博那边设置回调地址设置错误的问题。在成功授权之后访问 /oauth2/access_token 获取 token 的时候出了问题,rails 打印的 log 是:

Started GET "/auth/weibo/callback?state=a19358b76e43299be68ab3f56a72cdb7c757306692bce513&code=71ee2c6ac1f90a0175729e1be876f33e" for 114.245.43.71 at 2017-07-20 14:36:39 +0000
(weibo) Setup endpoint detected, running now.
(weibo) Callback phase initiated.
(weibo) Authentication failure! invalid_credentials: OAuth2::Error, redirect_uri_mismatch:
{"error":"redirect_uri_mismatch","error_code":21322,"request":"/oauth2/access_token","error_uri":"/oauth2/access_token"}
Started GET "/auth/failure?message=invalid_credentials&origin=https%3A%2F%2Fforum.idevfun.io%2Flatest&strategy=weibo" for 114.245.43.71 at 2017-07-20 14:36:40 +0000

这个像是 OmniAuth 这个库打印的。错误码 21322 是微博 /oauth2/access_token 接口返回的错误。然后我对照了一下 微博 API 文档,

发现貌似在请求 /oauth2/access_token 的时候,也是需要再次传 redirect_uri 参数的。那么问题来了,omniauth 在做这次请求的时候,是否配置了发送这个参数呢? 我是 ruby rails 小白,debug 起来实在有点吃力。这里看了一下并没有发现在哪里有传 redirect_uri 这个参数,求指点:


以上有关 omniauth 的初步结论参考了这个帖子

https://ruby-china.org/topics/31487#reply-309373

1赞

如果能有办法把omni auth发出的请求参数 dump 出来,可能就清楚到底上面的猜想对不对了,可惜 discourse 也不是特别熟悉,不知道怎么把它打印出来。

Omniauth::Strategies::OAuth2.build_access_token 里,callback_url 在 Omniauth::Strategy 里,Omniauth.config 可以覆盖一些东西,可以给一些 block 来做回调

似乎找到了问题所在, 一个 omniauth-oauth2 的 commit 导致 omniauth-oauth2-weibo 这个 strategy 在默认的配置下不可用,需要在 provider 的配置中手动配置 redirect_uri ,见 omniauth-oauth2-weibo 的 readme:

you can set up redirect_uri in omniauth.rb as following:

     token_params: {redirect_uri: "http://127.0.0.1:3000/auth/weibo/callback" }```

借鉴了别人解决这个问题的办法,我在 weibo strategy 里面把 callback_url 加回来了,测试了一下可以解决这个问题。提了个 pull request:

请站长看下是否可以这么解决。

1赞