F's Blog

博客 收藏夹
OAuth

07 Feb 2017

默认是 OAuth 2.0 版。

整个过程三步走:

  1. 用户点击 App(比如一个网站)的登录跳转到第三方(比如微信)的登录页面,进行登录授权。
  2. 第三方访问 App 之前注册 oauth 时提供的返回 url,并附上授权码 code,及上面可选的 state 信息。
  3. App 通过拿到的用户的授权码 code 及自己的 key 和 secret 获得用户授权的资源。

至于获得资源后怎么处理,登录还是新建用户,那就是 App 的事了。

OmniAuth

OmniAuth 是一个将第三方登录标准化的库,任何开发者可以编写策略链接登录服务。

它只是在获得信息后设置了环境变量,并通过 request.env[“omniauth.auth”] 返回,没有做其他操作。

通过提供不同的策略实现对不同第三方认证的登录,这里第三方的策略列表.

omniauth-oauth2

它是对 omniauth 的 oauth2 的封装,用了就方便些而已。

devise

devise 里是有针对 omniauth 的接口的,这里有参考

实战

把一个的架构打起来调试通后,其他 oauth 就不用费劲调试了,只要把返回的数据安照之前的归一化格式取出来就行了。

微信开放平台

我用的是omniauth-wechat-oauth2 的开放平台版。

开发调试

使用 ngrok,将本地的 development server 的端口映射到外网。

ngrok http 3000

这样会生成一个外网地址,比如:1zxcv3df.ngrok.io,访问这个地址就访问到了本机,这样 provider 的回调就能走通了。注意需要将第三方 provider,将回调域名改成上面生成的,开发完成后,再改回来上线就好了。

当然可以自己部署 ngrok 服务,参考这里

有了它简直神器啊,可以把自己的网站 open 出去,还用自己指定的域名。

微博

用的是 omniauth-weibo-oauth2 Gem.

开放调试

微博不像微信,只要当前浏览器里的域名在微博认证的根域名下即可。所以可以在本机的 hosts 里指定一个域名,比如 dev.xxxx.com 到 localhost,这样在本地调试时用的是 dev.xxxx.com,就能顺利跳出微博的登录界面。

因为之前已经把微信的调好,并且加入了微博的处理逻辑,所以在 devise.rb 里配置微博的 oauth provider:

config.omniauth :weibo, ENV["WEIBO_APP_ID"], ENV["WEIBO_APP_SECRET"],
  image_size: 'original',
  token_params: {redirect_uri: "http://xxxx.com/auth/weibo/callback" }

注意这里的回调 uri 是线上的。这样在开发环境下首先用 dev.xxxx.com 骗过微博登录,登录完成后会访问线上的处理 uri,但只会完成认证的那一半过程,之后会把授权码返回给开发环境,开发环境用它加上自己的 id 和 secret 就能获得微博资源了。

参考

本文由 付豪 创作,采用署名 4.0 国际(CC BY 4.0)创作共享协议进行许可,详细声明