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

HWIOAuthBundle, how to manually authenticate User with a Facebook access token?

我有一个带有 HWIOauthBundle 的网站 (Symfony2) 用于连接 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."
    

所以我的问题是:如何使用 Facebook 连接在前端和后端验证我的用户?

谢谢:)

嗯,我认为 Symfony 实际上并没有拒绝您的请求。脸书是。我不确定这是否有帮助,但我知道在处理 Facebook 身份验证时可能会出现很多问题:

  • 您知道该工具是否连同 code 参数一起发送 redirect_uri范围 ?如果是:

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

  • 愚蠢的问题,但是当你通过 Cordova 获得授权时,你是否检查过你的app_id是否相同?

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

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

总的来说,您的问题似乎几乎总是与 redirect_uri URI 格式有关。

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

  1. 在您的应用程序上验证用户
  2. 使用 Facebook 令牌向您的服务器发出 http 请求。
  3. 在服务器端,检查令牌是否用于您的 Facebook 应用程序,并检索用户的 Facebook ID。
  4. 根据获取的 ID 从数据库中获取您的用户。

这是我的 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 异常来处理登录错误。

当然,您确实应该使用 https,因为您将交换敏感信息。

我不知道这是否是最好的方法,但效果很好。 希望对您有所帮助!