新手问题 关于 Omniauth 的疑惑

xrlin · 2016年10月19日 · 最后由 wu125816653 回复于 2018年06月19日 · 2909 次阅读

Omniauth 在调用 callback_phase 设置 omniauth.auth 时,uid、name、info 等用户信息是从哪里获取的?是第三方平台登录授权后将浏览器重定向到 callback action 时携带的信息吗?但通过浏览器查看请求并没有看到有关信息,还是获取到 authorization code 后 ominiauth 主动调用获取 accesss_token 的接口并请求得到用户信息?求解答疑惑,感谢。

授权之后,Omniauth 会调用获取相关用户信息的 api 获取用户信息设置在 uid,info 里面。示例

Omniauth 号称 OAuth 框架,它做的把各种供应商(provider)的 OAuth 流程统一的事情(其实不仅仅是 OAuth,但大多数插件的验证流程都是 OAuth)。uid, name, info 是 Omniauth 统一规范的格式。这些数据普遍情况下都是各个插件自己调用供应商的 API 获取数据,然后把值填进去的。一般这个步骤在获取 access token 之后(OAuth 流程的最后一步)。

如果是写插件的话,Omniauth 已经负责了大部分 OAuth 的流程,架子都跟你搭好了,附上我之前写过的一个,因为太简陋了我都没敢做 gem,直接扔在 lib 里面了。

module OmniAuth
  module Strategies
    class SomeService < OmniAuth::Strategies::OAuth2
      option :name, 'xxx'
      option :client_options, {
        site:          'https://xxx',
        authorize_url: 'https://xxx',
        token_url:     '/v1/token.json',
      }

      uid { raw_info['id'] }
      info { {'name' => raw_info['name']} }
      extra { {'raw_info' => raw_info} }

      private

      def raw_info
        @raw_info ||= access_token.get('/v1/companies/me.json').parsed
      end
    end
  end
end

#1 楼 @gyorou 嗯,那 Omniauth 不就是在第三方平台授权后引导浏览器重定向到 callback 的 url 的同时调用获取相关用户信息的 api 并在请求完成前设置 omniauth.auth 信息到 request.env 中?是不是正因为这样通过浏览器的开发者工具是看不到 request 请求中 omniauth.auth 信息的?

#2 楼 @darkbaby123 本想了解一下 omniauth 功能的底层实现,发觉对代码了解很模糊,我还得提高下知识水平。

browser -> callback_url-> rack -> code ->access_token->user_info->request.env->callback_action

在执行 callback_action 之前使用 http client 取得了 token 和用户信息,放到 env 中去。

一句话,这货就是个 rack middleware。

新人想问下,这里的 option :name, 'xxx'和 option :client_options...都是什么意思啊?官方文档只看到一个 options。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号