2012-10-10 18 views
5

Ứng dụng Rails 3 của chúng tôi sử dụng facebook-omniauth, cho phép người dùng xác thực bằng facebook.Xác thực người dùng từ iOS Rails 3 server và Omniauth

Thật tuyệt khi sử dụng càng nhiều hệ thống xác thực dựa trên web càng tốt, vì vậy tôi đã thử làm theo câu trả lời (câu trả lời chưa được bỏ phiếu) thành this SO question nhưng tôi không thể công việc.

Các ý chính của câu trả lời là:

omniauth-facebook sẽ xử lý yêu cầu đến thiết bị đầu cuối gọi lại với một tham số access_token mà không cần bất kỳ rắc rối. Dễ dàng :)

Vì vậy, để kiểm tra điều này, trong trình duyệt của tôi, tôi đang phát hành các yêu cầu sau đây:

/users/auth/facebook_api/callback?access_token=BAAB... 

Nhưng trong nhật ký máy chủ của tôi, tôi thấy:

(facebook) Callback phase initiated. 
(facebook) Authentication failure! invalid_credentials: OAuth2::Error, : 
{"error":{"message":"Missing authorization code","type":"OAuthException","code":1}} 

tôi có thể 't tìm ra những gì tôi đang làm sai. Thực tế là tôi đang cố gắng làm điều này thông qua trình duyệt để kiểm tra điều gì đó lộn xộn? Bất kỳ ý tưởng khác về cách tôi có thể tái sử dụng logic auth www dựa trên của tôi cho ứng dụng ios của tôi?

UPDATE: Tôi không chắc chắn, nhưng tôi sau this guide để có nhiều chiến lược facebook omniauth, một cho www và một cho điện thoại di động.

+0

Bạn có tìm thấy câu trả lời cho điều này không? Tôi có chính xác cùng một vấn đề! Đây là câu hỏi của tôi http://stackoverflow.com/questions/14341867/how-to-authenticate-with-facebook-using-rest-with-devise-omniauth – Andres

+1

Thật không may là tôi đã không làm như vậy, nhưng tôi vừa đăng giải pháp của mình như một câu trả lời chính thức. Tôi không biết làm thế nào các poster trong câu hỏi tôi liên kết để có giải pháp của mình để làm việc, nhưng tôi hoàn toàn không thể. – djibouti33

Trả lời

7

Tôi chưa bao giờ tìm được giải pháp phù hợp với những gì tôi đã hỏi ban đầu, nhưng đây là cách tôi đã giải quyết: Lấy mã thông báo truy cập bạn nhận được trên iPhone và gửi lên máy chủ của bạn và thực hiện đăng nhập theo cách thủ công.

def facebook_login 
    graph = Koala::Facebook::API.new(params[:user][:fb_access_token]) 
    profile = graph.get_object('me') 
    omniauth = build_omniauth_hash(profile) 

    @user = User.find_or_create_for_facebook_oauth(omniauth) 
end 

On www chúng tôi đã có một phương pháp gọi là find_or_create_for_facebook_oauth, và đó mất kết quả từ Omniauth và một trong hai tìm thấy người dùng hoặc tạo một hình mới. Để sử dụng phương pháp đó cho thiết bị di động, tôi phải xây dựng một cấu trúc tương tự bằng tay để tôi có thể chuyển nó thành một đối số.

def build_omniauth_hash(profile) 
    struct = OpenStruct.new 
    struct.uid = profile['id'] 
    struct.info = OpenStruct.new 
    struct.info.email = profile['email'] 
    struct.info.image = "http://graph.facebook.com/#{profile['id']}/picture?type=square" 
    struct.info.first_name = profile['first_name'] 
    struct.info.last_name = profile['last_name'] 
    struct.info.bio = profile['bio'] 
    struct.info.hometown = profile['hometown']['name'] if profile['hometown'] 
    struct.info.location = profile['location']['name'] if profile['location'] 
    struct 
end 
+0

cảm ơn người đàn ông, tôi sẽ làm điều này và nếu tôi tìm thấy cái gì khác tôi sẽ cập nhật cho bạn ở đây! – Andres

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