2010-10-17 8 views

Trả lời

0

yêu cầu.env ['omniauth.auth'] cần có những gì bạn cần. Đối với Twitter, nó trả về một cái gì đó như

{ 
    'uid' => '12356', 
    'provider' => 'twitter', 
    'user_info' => { 
    'name' => 'User Name', 
    'nickname' => 'username', 
    # ... 
    } 
} 

Chỉ cần kiểm tra nó để mở.

+2

những gì nó trả về cho twitter và openid là hoàn toàn khác nhau. – cbrulak

2

Bạn có thể tìm thấy this Railscast (towards the end) bởi Ryan Bates hữu ích để chụp địa chỉ email khi xác thực qua OpenID. Đối với các trường có sẵn khác, tôi đoán bạn có thể thêm một số thông tin sau vào bộ điều khiển xác thực của mình khi thực hiện yêu cầu xác thực

# authentications_controller.rb 
... 
def create 
    omniauth = request.env["omniauth.auth"] 
    raise omniauth.to_yaml 
    ... 
end 
... 

và sau đó đăng nhập qua openID và xem bạn có tùy chọn nào.

+1

Điều đó sẽ không hoạt động - không có nhiều tùy chọn có sẵn theo mặc định với openid. Câu hỏi đặt ra là làm thế nào để làm cho chúng có sẵn, không phải làm thế nào để lấy chúng từ request.env. –

+0

Ah, tệ lắm. Đoán tôi hiểu lầm: / – kbjerring

0

yêu cầu.env ['omniauth.auth'] sẽ chứa toàn bộ phản hồi từ cuộc gọi lại. Nhưng không phải tất cả các nhà cung cấp đều trả lại email của người dùng (twitter sẽ không). OpenID qua google hoặc yahoo nên có email như một phần của băm 'user_info'.

4

Bạn có yêu cầu cách yêu cầu dữ liệu đó không hoặc cách đảm bảo bạn nhận được dữ liệu đó? Bạn có thể yêu cầu dữ liệu bằng cách sử dụng các thuộc tính OpenID AX, nhưng nhà cung cấp OpenID không bắt buộc phải trả lời những gì bạn yêu cầu. Điều này cần được giúp đỡ một số mặc dù:

Retrieve OpenID AX attributes from Google/Yahoo in Rails

Nó có vẻ như Google sẽ trả lời với một email chỉ để

http://schema.openid.net/contact/email 

trong khi Yahoo sẽ trả lời

http://axschema.org/contact/email 
1

Có một số hướng dẫn cho mục này trong phần "OpenID" của Google trong tài liệu tích hợp Devnia omniauth:

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Hãy tìm những phương pháp lớp find_for_open_id trong mô hình người dùng và bộ điều khiển lớp con Users::OmniauthCallbacksController cho cách dữ liệu được truyền qua từ request.env["omniauth.auth"] băm. Điều này liên quan đến bất kỳ chiến lược OpenID nào, không chỉ là chiến lược của Google.

Về mặt tùy chỉnh chính xác thuộc tính bạn yêu cầu từ nhà cung cấp OpenID, bạn có thể tốt nhất để tạo bản sao của riêng bạn của đá quý omniauth_openid hoặc phân lớp và thay đổi options. (Xem: https://github.com/intridea/omniauth-openid/blob/master/lib/omniauth/strategies/open_id.rb)

0

Khi bạn định cấu hình omniauth trong khối khởi tạo, bạn có thể ghi đè bất kỳ tùy chọn nào, bao gồm trường bắt buộc và tùy chọn. Theo tài liệu, hãy sử dụng Builder để nhận những gì bạn cần được định cấu hình. EG:

config.middleware.use OmniAuth::Builder do 
     provider :open_id, :name => 'my_provider', 
       :identifier => 'https://myprovider.com/openid/xrds', 
       :required => ['http://axschema.org/namePerson/first','http://axschema.org/namePerson/last','http://axschema.org/contact/email','http://axschema.org/my_provider/some_field'] 
    end