HWIOAuthBundle,如何使用Facebook访问令牌手动验证用户?

时间:2015-04-27 14:16:12

标签: facebook symfony authentication hwioauthbundle

我有一个网站(Symfony2),其中HWIOauthBundle用于连接Facebook,一切正常。

现在,我正在尝试使用Cordova和Ionic框架(AngularJS)构建iOS应用程序,我想用Facebook验证我的用户:

  1. 使用$cordovaFacebook,我对用户进行身份验证并获得有效的Facebook访问令牌,确定

  2. 我尝试使用此访问令牌在服务器端使用HWIOauthBundle对我的用户进行身份验证:

    GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN
    
  3. Symfony使用此日志拒绝我的请求:

    INFO - Matched route "facebook_login" (parameters: "_route": "facebook_login")
    INFO - Authentication request failed: OAuth error: "Invalid verification code format."
    
  4. 所以我的问题是:如何通过Facebook连接在前端和后端验证我的用户?

    谢谢:)

2 个答案:

答案 0 :(得分:3)

我也一直想知道如何使用HWIOAuthBundle实现服务器端登录。 我没有在网上找到任何解决方案,所以我根据我在网上阅读的提示对功能进行了编码。 基本上,你必须:

  1. 在您的应用上验证用户
  2. 使用Facebook令牌向您的服务器发出http请求。
  3. 在服务器端,检查令牌是否适用于您的Facebook应用,并检索用户的Facebook ID。
  4. 根据提取的ID从DB获取用户。
  5. 这是我的Symfony控制器:

    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.
    }
    

    我抛出Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException异常来处理我的应用程序上的登录错误。

    当然,您真的应该使用http s ,因为您将交换合理的信息。

    我不知道这是否是最佳方式,但效果很好。 希望它有所帮助!

答案 1 :(得分:2)

嗯,我认为Symfony实际上并没有拒绝您的请求。 Facebook是。我不确定这是否有帮助,但我知道在处理Facebook Auth时会出现一大堆问题:

  • 您知道该工具是否与代码参数一起发送 redirect_uri 参数?如果是这样的话:

  • 您是否检查过你的 redirect_uri 是否有尾随斜杠? See this

  • 愚蠢的问题,但是当你通过 Cordova授权时,你确定你的app_id是一样的吗?

  • 检查您的 redirect_uri 是否没有任何查询参数。

  • 检查您在整个过程中使用的 redirect_uri 是否始终相同。

总的来说,您的问题似乎几乎始终与 redirect_uri URI格式相关。