我正在尝试将 Omniauth 集成到用 Rails 编写的 API 中,以供 Android 应用程序使用。这意味着我希望能够使用 JSON 处理omniauth 回调。
默认情况下,Omniauth 将其回调发送到/auth/:provider/callback
,有没有办法可以强制 Omniauth 将其回调发送到/auth/:provider/callback.json
?
我正在尝试将 Omniauth 集成到用 Rails 编写的 API 中,以供 Android 应用程序使用。这意味着我希望能够使用 JSON 处理omniauth 回调。
默认情况下,Omniauth 将其回调发送到/auth/:provider/callback
,有没有办法可以强制 Omniauth 将其回调发送到/auth/:provider/callback.json
?
您可以在处理回调的操作中指定格式:
# in route.rb
match '/auth/:provider/callback' => 'authentications#create'
# in authentications_controller.rb
class AuthenticationsController < ApplicationController
def create
# your code here
respond_to do |format|
format.json { ... } # content to return
end
end
end
我设法通过检查我的 rails 后端上的请求对象来做到这一点。
当我在我的应用程序上提出请求时,我在提交中添加了定义格式的数据:
format: "json"
然后omniauth会回调
/auth/:provider/callback
在我的情况下匹配
sessions#create
作为 HTML 请求。但是一旦到了那里,如果你在 rails 中查看你的请求对象,并搜索 omniauth.params 哈希,你会看到其中一个值是初始请求的数据传递的格式:
"omniauth.params"=>{"format"=>"json", "provider"=>"facebook", "code"=>"..."}
它是您搜索此“格式”=>“json”并执行渲染 json 作为回答的问题。
我希望它能解决你的问题。
# app/controllers/users_controller.rb
def authenticate
@credentials = request.env['omniauth.auth']
render json: @credentials
end
# config/routes.rb
get '/auth/:provider/callback', to: 'users#authenticate', as: 'user_auth'
然后所有的请求/auth/:provider/callback
都会默认返回一个 JSON 响应。