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-gem và openid-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!
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
@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
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