【问题标题】:HWIOAuthBundle, how to manually authenticate User with a Facebook access token?HWIOAuthBundle,如何使用 Facebook 访问令牌手动验证用户?
【发布时间】:2015-04-27 14:16:12
【问题描述】:

我有一个带有 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 连接在前端和后端验证我的用户?

谢谢:)

【问题讨论】:

  • 目前正在查看完全相同的问题 - 您解决了吗?如果是这样,你是如何解决这个问题的?在任何地方都找不到任何东西!
  • 是的。没有人知道它是如何工作的。我的意思是,您可以轻松地进行数据库身份验证,然后您就可以了。但是做任何自定义都太复杂了(比如不允许匿名绑定时的 LDAP)。这真的很可悲,因为框架的其他一切都很漂亮。
  • 这是因为“code”参数应该是授权码而不是访问令牌...访问令牌实际上是对该请求的响应。但我也卡住了,我想从前端获取授权码,这样我就可以回到 HWIOauth 进程。

标签: facebook symfony authentication hwioauthbundle


【解决方案1】:

我也一直想知道如何使用 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,因为您将交换有意义的信息。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    总的来说,您的问题似乎几乎所有时间都与 redirect_uri URI 格式有关。

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 1970-01-01
      • 2015-02-25
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      相关资源
      最近更新 更多