Helpex - Trao đổi & giúp đỡ Đăng nhập
5

Tôi đang sử dụng Devise auth token gem và ng-token auth để xác thực ứng dụng trang đơn của mình. Ngoài đăng ký bằng email, còn có tùy chọn đăng ký qua Facebook. Nó hoạt động.

Vấn đề của tôi là đối với phạm vi yêu cầu Fb của tôi, tôi đã đặt để lấy user_friends, email và public_info, tuy nhiên khi tôi nhận được yêu cầu, tôi không thấy auth_hash request.env ['omniauth.auth']. Điều này được mô tả trong tài liệu về đá quý omniauth-facebook .

Về cơ bản, tôi muốn lưu những gì FB trả lại về người dùng trong cơ sở dữ liệu của tôi. Bạn sẽ làm điều này như thế nào?

5 hữu ích 2 bình luận 1.5k xem chia sẻ
1

Tôi sử dụng điểm cuối này với ứng dụng Ionic2, cho các yêu cầu Đăng nhập Facebook trên API Rails 5, sử dụng KoalaDevise Token Auth để bạn có thể sao chép trên bất kỳ ứng dụng Rails 5 nào:

def facebook
  @graph = Koala::Facebook::API.new(oauth_params[:token], ENV["FACEBOOK_SECRET"])
  @profile = @graph.get_object("me?fields=email,first_name,last_name,picture.type(large)")

  unless @user = User.where(email: @profile["email"])&.first
    @user = User.new(email: @profile["email"])
  end
  #
  # Here you will make your logic for saving Facebook's data on your User model,
  # customize accordingly
  #
  if @user.new_record?
    p = SecureRandom.urlsafe_base64(nil, false)
    @user.password = p
    @user.password_confirmation = p
    #
    # "Passwordless" login, user must set password after registering,
    # or be forever haunted by indecipherable SecureRandom value
    #
    @user.name = @profile["first_name"]+ " " + @profile["last_name"]
    @user.remote_avatar_url = @profile["picture"]["data"]["url"]
    @user.confirmed_at = Time.now
    @user.uid = @profile["id"]
    @user.provider = 'Facebook'
  end

  @client_id = SecureRandom.urlsafe_base64(nil, false)
  @token     = SecureRandom.urlsafe_base64(nil, false)
  @user.tokens[@client_id] = {
    token: BCrypt::Password.create(@token),
    expiry: (Time.now + DeviseTokenAuth.token_lifespan).to_i
  } 
  auth_header = @user.build_auth_header(@token, @client_id)
  # update the response header
  response.headers.merge!(auth_header)
  @user.save!
  if sign_in(:user, @user, store: false, bypass: false)
    render json:  {
      data: @user.token_validation_response 
    }
  end
end

Trỏ một tuyến đường POST tới đây và chuyển authResponse.accessTokentừ yêu cầu của Facebook dưới dạng params[:token]. Voilà, phép thuật xác thực!

1 hữu ích 0 bình luận chia sẻ
0

Tôi không biết cách thực hiện việc này với Angular và Rails, nhưng đây là cách tôi đã làm trong ứng dụng Rails của mình.

def show 
 #controller action
 @FbInfoforFrontEnd = FbModel.from_omniauth(request.env["omniauth.auth"])
end

và trong mô hình FbModel, tôi sẽ triển khai cơ chế để lưu mã thông báo và phần còn lại của thông tin như thế này

def self.from_omniauth(auth)
 #FbModel model method
 oauth = Koala::Facebook::OAuth.new(AppId, AppSecret)
 new_access_info = oauth.exchange_access_token_info auth.credentials.token
 new_access_token = new_access_info["access_token"]
 new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds
 return FbModel.where(provider: auth.provider,
                      uid: auth.uid)
               .first_or_create(provider: auth.provider,
                         uid: auth.uid,
                         name: auth.info.name)
               .update_attributes(oauth_expires_at: new_access_expires_at,
                                  oauth_token: new_access_token)
end

Tôi hy vọng điều này trả lời câu hỏi của bạn

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby-on-rails ruby angularjs devise , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading