使用自定义工作流程构建 OmniAuth 策略

Building an OmniAuth strategy with a custom workflow

我想实现如下登录流程:

  1. 用户点击登录按钮
  2. 用户被重定向到我们的身份验证平台
  3. 用户提交登录凭据,然后被重定向回我们的 网站通过预设回调 URL
  4. OmniAuth 策略必须解码响应(使用我们的 SDK)并且 将结果保存在 omniauth.auth 哈希

使用 OmniAuth 策略是否可以轻松实现此过程?从文档中我不是很清楚,而且大多数已经构建的策略似乎都在使用 OAuth 工作流。

显然这很容易做到。

OmniAuth 策略

module OmniAuth
  module Strategies
    class Service
      include OmniAuth::Strategy

      def request_phase
        redirect AUTHENTICATION_URL
      end

      uid { @user_details.user_id }

      def extra
        @user_details # Return a hash with user data
      end

      def callback_phase
        # Configure Service SDK
        @user_details = Service.user_data # Make SDK call to get user details
        super
      end
    end
  end
end

应用程序

1) 添加带有身份验证的登录按钮 URL:

<%= link_to 'Login', 'auth/service' %>

2) 添加回调路由

get '/auth/service/callback', to: 'sessions#create'

3) 在控制器中处理回调响应

class SessionsController < ApplicationController
  def create
    @user = User.find_or_create_by(service_id: auth_hash.uid)
    # Handle @user
  end
end