2012-04-12 22 views
8

Tôi đang sử dụng phiên bản 0.7.7 của Sorcery Authentication Gem bởi NoamB trên tôi Rails 3.2 AppPhù thủy Gem - Tuỳ chỉnh user_info_mapping cho các nhà cung cấp bên ngoài

Tôi đang tìm kiếm một khả năng làm thế nào tôi có thể treo lên một phương pháp được thực hiện việc lập bản đồ thông tin người dùng cho một số cụ thể external login provider (e.g. facebook, twitter).

Ví dụ: tôi muốn thay đổi ngôn ngữ được cung cấp sang định dạng tôi sử dụng trong cơ sở dữ liệu của mình hoặc tôi muốn tải xuống hình đại diện người dùng từ twitter như một phần của quy trình đối sánh.

Theo mặc định nó chỉ có thể cách này trong sorcery.rb file:

config.facebook.user_info_mapping = {:email => "email", :first_name => "first_name", :last_name => "last_name" ... 

Tôi biết tôi có thể đạt được hành vi như vậy với các phương pháp setter trên mô hình của tôi sử dụng nhưng tôi muốn giữ những điều này tách biệt với mô hình và Tôi muốn có thể xác định chúng cụ thể cho từng nhà cung cấp.

Điều này có khả thi không? / Cách tốt nhất để triển khai các tùy chọn ánh xạ mở rộng này là gì?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

0

Có vẻ như bạn có thể làm điều này bằng cách mở rộng các lớp nhà cung cấp Sorcery khác nhau để thêm các trường ứng dụng cụ thể mà bạn muốn băm thông tin người dùng.

Ví dụ, để sử dụng Twitter bạn có thể có một cái gì đó như thế này định nghĩa:

config.external_providers = [:twitter] 

Bạn có thể thay đổi điều này để:

config.external_providers = [:TwitterWithAvatar] 

Bây giờ bạn cần phải xác định các nhà cung cấp TwitterWithAvatar dưới Sorcery::Providers, và ghi đè phương thức #get_user_hash:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def get_user_hash(access_token) 
     user_hash = super 
     user_hash.merge(
      avatar: get_avatar(user_hash[:uid]), 
     ) 
     end 

     private 

     def get_avatar(uid) 
     # Some Twitter API call 
     end 
    end 
    end 
end 

Bây giờ bạn có thể thiết lập bản đồ của bạn:

config.TwitterWithAvatar.user_info_mapping = {avatar: "avatar"} 

Ngoài ra, kể từ khi bạn đã sử dụng một lớp cung cấp tùy chỉnh, bạn có thể di chuyển bản đồ của bạn vào lớp rằng:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def user_info_mapping 
     { 
      avatar: "avatar", 
      # ... 
     } 
     end 
    end 
    end 
end 

(Tôi có không đã thử chạy mã này, vì vậy các chi tiết có thể hơi lệch, nhưng từ việc đọc mã nguồn của Sorcery, điều này có vẻ như đúng hướng.)

Các vấn đề liên quan