2009-04-25 27 views
10

Tôi đang chơi với số authlogic-example-app và tôi không nhận được địa chỉ email từ nhà cung cấp OpenID (trong trường hợp của tôi: Google và Yahoo) khi tôi đăng ký người dùng, resp. Tôi nhận được phản hồi trống thay vì địa chỉ email (kiểm tra các nhận xét trong mã bên dưới).Ruby-OpenID: Yêu cầu địa chỉ email từ nhà cung cấp OpenID

Đây là cách mô hình người dùng của tôi trông như thế nào (mọi thứ khác trông giống như "with_openid" -branch của ứng dụng ví dụ authlogic được đề cập ở trên). Bên cạnh 'email' bị thiếu, quy trình xác thực openid hoạt động như mong đợi:

class User < ActiveRecord::Base 
    acts_as_authentic do |c| 
    # not needed because I use OpenID 
    c.validate_login_field = false 
    # avoid failed validation before OpenID request 
    c.validate_email_field = false 
    # this one sets 'openid.sreg.required=email' 
    c.required_fields = [:email] 
    end 

    private 

    # overwriting the existing method in '/lib/authlogic_openid/acts_as_authentic.rb' 
    def map_openid_registration(registration) 
    # this is my problem: 'registration' is an empty hash 
    self.email ||= registration[:email] if respond_to?(:email) && !registration[:email].blank? 
    end 

end 

Bất kỳ ý tưởng nào để giải quyết vấn đề này? Có ai ở đây thực hiện việc này trước khi sử dụng authlogic không? Hoặc thậm chí tốt hơn: Bạn có một ví dụ làm việc?

Cập nhật: Tôi đã kiểm tra Google Account Authentication API và so sánh yêu cầu nộp bằng authlogic (sử dụng ruby-openid-gemopenid-authentication-plugin) với example requests trên các tài liệu xác thực tài khoản Google API: Yêu cầu


Ví dụ để xác thực và lấy địa chỉ email của Google:

https://www.google.com/accounts/o8/ud 
?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.return_to=http%3A%2F%2Fwww.example.com%2Fcheckauth 
&openid.realm=http%3A%2F%2Fwww.example.com%2F 
&openid.assoc_handle=ABSmpf6DNMw 
&openid.mode=checkid_setup 
&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0 
&openid.ext1.mode=fetch_request 
&openid.ext1.type.email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail 
&openid.ext1.required=email 

Đã gửi yêu cầu bằng appliation tôi:

https://www.google.com/accounts/o8/ud 
?openid.assoc_handle=AOQobUcdICerEyK6SXJfukaz8ygXiBqF_gKXv68OBtPXmeafBSdZ6576 
&openid.ax.mode=fetch_request 
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 
&openid.mode=checkid_setup 
&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 
&openid.ns.ax=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0 
&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1 
&openid.realm=http%3A%2F%2Flocalhost%3A3000%2F 
&openid.return_to=http%3A%2F%2Flocalhost%3A3000%2Faccount%3Ffor_model%3D1%26_method%3Dpost%26open_id_complete%3D1 
&openid.sreg.required=email 

Trong khi gỡ lỗi toàn bộ thiết lập, tôi đã phát hiện ra rằng openid-authentication-plugin không bao giờ nhận được một email trong phản ứng mà nó nhận được từ nhà cung cấp OpenID, điều này ít nhất giải thích tại sao registration băm trong sử dụng mô hình của tôi là trống rỗng ...

CẬP NHẬT: Nếu bạn đang chơi xung quanh với authlogic và openid, đừng quên kiểm tra latest railscast on this subject!

Trả lời

10

Vì không ai có thể giúp tôi, tôi đã giúp bản thân mình. :-)

Câu trả lời ngắn cho câu hỏi của tôi là:

c.required_fields = [:email,"http://axschema.org/contact/email"] 

Sử dụng dòng này, ứng dụng yêu cầu các email-địa chỉ sử dụng sreg và rìu (request-type được hỗ trợ bởi Google).

Bạn có thể tìm một câu trả lời chi tiết hơn và thực hiện làm việc của authlogic-openid với Javascript OpenID-Selector ngay tại đây:

http://github.com/vazqujav/authlogic_openid_selector_example/

+0

Tôi gặp lỗi khi các trường này được bật ... phương thức chưa xác định 'required_fields = 'for # ... không có chúng: # c.required_fields = ["http://axschema.org/contact/email"] # tìm nạp email theo sreg # c.optional_fields = ["email"] nó hoạt động. – holden

+0

@holden: Tôi đã giải quyết vấn đề này là trả lời cho vấn đề github mà bạn đã gửi. – Javier

+0

Bạn cũng có thể quan tâm đến ngã ba này, mà (theo README) có nghĩa là để đối phó với một số lựa chọn SReg so với AX: https://github.com/binaryfeed/open_id_authentication - Tôi không chắc nó thực sự trả lời câu hỏi, mỗi lần, nó dường như có liên quan đến chủ đề. – lindes

0

Thử nghiệm với máy chủ OpenID mà bạn kiểm soát, vì nó sẽ cho phép bạn gỡ lỗi mọi phần của chuỗi OpenID. Không có gì đảm bảo rằng nhà cung cấp OpenID của Google đang làm đúng. Hãy thử kiểm tra với máy chủ của Verisign, vì tôi khá chắc chắn rằng một trong ít nhất nên làm điều đúng với trường openid.sreg.required=email.

Đoạn mã của bạn trông phù hợp với tôi.

3

Trong khi điều này đã chỉ cho tôi đi đúng hướng, những gì tôi cần là:

c.openid_required_fields = [:email,"http://axschema.org/contact/email"] 

Điều này đã được gửi trong email và đặt.

2
# fetch email by ax 
c.openid_required_fields = [ 
          "http://axschema.org/contact/email", 
          "http://axschema.org/namePerson/first", 
          "http://axschema.org/namePerson/last", 
          "http://axschema.org/contact/country/home", 
          "http://axschema.org/pref/language" 
          ] 

này fetches trong nhiều giá trị theo quy định @http://code.google.com/apis/accounts/docs/OpenID.html#Parameters

Mặc dù tôi vẫn không thể tìm nạp trong tên quốc gia ... tên, email, ngôn ngữ hoạt động hoàn hảo!

0

vấn đề là tôi có thể lấy các thông số từ nhà cung cấp nhưng không thể trích xuất chúng từ các phản ứng ... tôi đã sử dụng OpenID :: AX :: FetchResponse.from_success_response (open_id_response) như đối tượng để giữ phản hồi ... tôi sử dụng phương pháp nào để trích xuất email, biệt hiệu, quốc gia, v.v ...

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