OmniAuth: Connect Social Network(SN) với nhiều callback URL và không sử dụng Devise gem

OmniAuth: Connect Social Network(SN) với nhiều callback URL và không sử dụng Devise gem

Thông thường khi sử dụng gem OmniAuth với mục đích đăng nhập, trong routes.rb sẽ định nghĩa kiểu:

get '/auth/failure', to: 'sessions#error'
get '/auth/:provider', to: -> { [404, {}, ['Not Found']] }, as: 'auth'
get '/auth/:provider/callback', to: 'sessions#create'

Thay vì định nghĩa /auth, mà định nghĩa bằng 1 tiền tố khác, /connect chẳng hạn, thì sẽ không kết nối được với SN.

get '/connect/failure', to: 'sessions#error'
get '/connect/:provider', to: -> { [404, {}, ['Not Found']] }, as: 'connect'
get '/connect/:provider/callback', to: 'sessions#create'

Nguyên nhân là do trong gem OmniAuth định nghĩa mặc định 1 tham số là config.path_prefix = '/auth'.

Để giải quyết trường hợp trên, muốn định nghĩa tiền tố trong routes ngoài /auth cần định nghĩa lại config.path_prefix = '/tiềntốgìđó'.


Vậy còn trường hợp muốn kết nối đến các SN từ nhiều controller khác nhau ?
Ví dụ một bài toán cụ thể là 1 trang web vừa cho phép đăng nhập bằng SN, và các xử lý sau khi đăng nhập cũng cho phép kết nối SN.

Trong trường hợp này, mình sử dụng constraint ở routes.
Mỗi lần kết nối SN, update lại config.path_prefix của OmniAuth.
Hiện tại, đây là giải pháp tạm thời mình có thể nghĩ ra. Tuy nhiên, có vẻ như đã dùng sai đi mục đích tồn tại của constraint.

Cụ thể như sau:
Tạo file routes_constraint.rb chứa các constraint class sử dụng trong routes.rb:

class OmniAuthPathPrefixConstraint
  def self.matches?(request)
    if request.original_url.include? 'auth'
      OmniAuth.config.path_prefix = '/auth'
    elsif request.original_url.include? 'connect'
      OmniAuth.config.path_prefix = '/connect'
    end
    true
  end
end

Trong routes.rb:

Khai báo file constraint trên:

require 'config/routes_constraint.rb'

Khai báo các callback routes khác nhau, ví dụ các routes chứa các path_prefix/auth/connect.

constraints OmniAuthPathPrefixConstraint do
    get '/auth/failure', to: 'sessions#error'
    get '/auth/:provider', to: -> { [404, {}, ['Not Found']] }, as: 'auth'
    get '/auth/:provider/callback', to: 'sessions#create'

    get '/connect/failure', to: 'sessions#error'
    get '/connect/:provider', to: -> { [404, {}, ['Not Found']] }, as: 'connect'
    get '/connect/:provider/callback', to: 'users#add_sns'
end

Lưu ý: Trong một số SN như LinkedIn, Authorize Redirect URL cũng cần được thêm vào tương ứng với các tiền tố mà mình thêm vào.
https://localhost:3000/auth/linkedin/callback
https://localhost:3000/connect/linkedin/callback

VietNguyen 13-05-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Vie

8 bài viết.
3 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
1 0
Ngôn ngữ truy vấn cho API GraphQL và Ecto GraphQL: http://graphql.org/ Thư viện GraghQL dùng trên Ecto: https://github.com/absinthegraphql/absint...
Vie viết 1 năm trước
1 0
White
1 1
Zoom in, zoom out trên webview Tag meta có name='viewport' sẽ định nghĩa trạng thái zoom in, zoom out. Các thuộc tính được set trong content='......
Vie viết 3 tháng trước
1 1
Bài viết liên quan
White
8 1
Tiếp theo (Link) Mình sẽ hướng dẫn cách test căn bản cho API mình tạo. Thật ra mà nói thì mình phải viết test trước khi làm nhưng mà để tránh việc...
My Mai viết 3 năm trước
8 1
White
7 4
Nếu ai đã làm Rails thì không còn lạ lẫm gì với chức năng Migration của Rails. Nếu ai chưa biết thì tôi xin giới thiệu sơ qua chức năng này. Rails ...
Lơi Rệ viết hơn 3 năm trước
7 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
8 bài viết.
3 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!