2015-04-27 16 views
8

Tôi có một trang web (Symfony2) với HWIOauthBundle được sử dụng để kết nối với Facebook và mọi thứ hoạt động tốt.HWIOAuthBundle, cách xác thực người dùng bằng mã thông báo truy cập Facebook theo cách thủ công?

Bây giờ, tôi đang cố gắng để xây dựng một ứng dụng iOS với khuôn khổ Cordova và Ionic (AngularJS) và tôi muốn để xác thực người dùng của tôi với Facebook:

  1. Với $cordovaFacebook, tôi xác thực người dùng của tôi và có được một hợp lệ access token Facebook, đó là ok

  2. tôi cố gắng sử dụng thẻ truy cập này để xác thực người dùng của tôi trên server-side với HWIOauthBundle:

    GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN 
    
  3. Symfony từ chối yêu cầu của tôi với log này:

    INFO - Matched route "facebook_login" (parameters: "_route": "facebook_login") 
    INFO - Authentication request failed: OAuth error: "Invalid verification code format." 
    

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể xác thực người dùng của tôi trên cả hai mặt trước và sau kết thúc với Facebook kết nối?

Xin cảm ơn :)

+0

Hiện đang xem xét cùng một vấn đề chính xác - bạn đã giải quyết vấn đề này chưa? Nếu vậy, làm cách nào bạn giải quyết vấn đề này? Không thể tìm thấy bất cứ điều gì ở bất cứ đâu – iLikeBreakfast

+1

Đúng. Không ai biết nó hoạt động như thế nào. Ý tôi là, bạn có thể dễ dàng làm cơ sở dữ liệu auth và từ đó bạn vàng. Nhưng đó là cách quá phức tạp để làm bất cứ điều gì tùy chỉnh (như LDAP khi liên kết vô danh không được phép). Và nó thực sự buồn vì mọi thứ khác về khung công tác đều đẹp. – DinoAmino

+0

Điều này là do thông số "mã" được cho là mã ủy quyền không phải mã thông báo truy cập ... Mã thông báo truy cập thực sự sẽ là phản hồi cho yêu cầu này. Nhưng tôi cũng bị mắc kẹt, tôi muốn nhận mã ủy quyền từ giao diện người dùng để tôi có thể quay lại quy trình HWIOauth. – TrtG

Trả lời

3

Tôi cũng đã tự hỏi cách triển khai đăng nhập bên máy chủ với HWIOAuthBundle. Tôi không tìm thấy bất kỳ giải pháp nào trên web, vì vậy tôi đã mã hóa chức năng dựa trên các gợi ý tôi đã đọc trên mạng. Về cơ bản, bạn phải:

  1. xác thực người dùng trên ứng dụng của bạn
  2. làm một http request đến máy chủ của bạn với các dấu hiệu Facebook.
  3. ont phía máy chủ, kiểm tra xem mã thông báo có dành cho ứng dụng Facebook của bạn và truy xuất ID Facebook của người dùng hay không.
  4. Đưa người dùng của bạn từ DB dựa trên ID đã tìm nạp.

Dưới đây là bộ điều khiển Symfony tôi:

public function getSecurityFbAction($token) 
{ 
    // Get the token's FB app info. 
    @$tokenAppResp = file_get_contents('https://graph.facebook.com/app/?access_token='.$token); 
    if (!$tokenAppResp) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Make sure it's the correct app. 
    $tokenApp = json_decode($tokenAppResp, true); 
    if (!$tokenApp || !isset($tokenApp['id']) || $tokenApp['id'] != $this->container->getParameter('oauth.facebook.id')) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Get the token's FB user info. 
    @$tokenUserResp = file_get_contents('https://graph.facebook.com/me/?access_token='.$token); 
    if (!$tokenUserResp) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 

    // Try to fetch user by it's token ID, create it otherwise. 
    $tokenUser = json_decode($tokenUserResp, true); 
    if (!$tokenUser || !isset($tokenUser['id'])) { 
     throw new AccessDeniedHttpException('Bad credentials.'); 
    } 
    $userManager = $this->get('fos_user.user_manager'); 
    $user = $userManager->findUserBy(array('facebookId' => $tokenUser['id'])); 

    if (!$user) { 
     // Create user and store its facebookID. 
    } 

    // Return the user's JSON web token for future app<->server communications. 
} 

Tôi ném Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException ngoại lệ để xử lý lỗi đăng nhập vào ứng dụng của tôi.

Tất nhiên, bạn thực sự nên sử dụng http s vì bạn sẽ trao đổi thông tin hợp lý.

Tôi không biết đó là cách tốt nhất để làm điều đó nhưng nó hoạt động tốt. Hy vọng điều đó sẽ hữu ích!

2

Vâng, tôi nghĩ Symfony không thực sự từ chối yêu cầu của bạn. Facebook là. Tôi không chắc chắn nếu điều này có thể giúp đỡ, nhưng tôi biết rằng một bó một vấn đề có thể xảy ra khi giao dịch với Facebook Auth:

  • Bạn có biết nếu công cụ gửi, cùng với đang tham số, thông số redirect_uri? Nếu vậy:

  • Bạn có kiểm tra xem redirect_uri CÓ dấu gạch chéo ở cuối không? See this

  • Silly câu hỏi, nhưng bạn đã kiểm tra xem APP_ID của bạn là tương tự khi bạn đã ủy quyền qua Cordova?

  • Kiểm tra xem redirect_uri KHÔNG có bất kỳ thông số truy vấn nào.

  • Kiểm tra xem redirect_uri mà bạn sử dụng trong suốt toàn bộ quá trình có giống nhau không.

Nhìn chung, có vẻ như vấn đề của bạn là gần như tất cả các thời gian liên quan đến việc định dạng redirect_uri URI.

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