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。
@pynix @gyorou @darkbaby123 多谢
新人想问下,这里的 option :name, 'xxx'和 option :client_options...都是什么意思啊?官方文档只看到一个 options。