HWIOAuthBundle,如何使用 Facebook 访问令牌手动验证用户?
HWIOAuthBundle, how to manually authenticate User with a Facebook access token?
我有一个带有 HWIOauthBundle 的网站 (Symfony2) 用于连接 Facebook,一切正常。
现在,我正在尝试使用 Cordova 和 Ionic 框架 (AngularJS) 构建一个 iOS 应用程序,我想通过 Facebook 验证我的用户:
使用 $cordovaFacebook
,我验证我的用户并获得有效的 Facebook 访问令牌,没关系
我尝试使用此访问令牌通过 HWIOauthBundle 在服务器端验证我的用户:
GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN
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 实现服务器端登录。
我没有在网上找到任何解决方案,所以我根据我在网上阅读的提示对功能进行了编码。
基本上,您必须:
- 在您的应用程序上验证用户
- 使用 Facebook 令牌向您的服务器发出 http 请求。
- 在服务器端,检查令牌是否用于您的 Facebook 应用程序,并检索用户的 Facebook ID。
- 根据获取的 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,因为您将交换敏感信息。
我不知道这是否是最好的方法,但效果很好。
希望对您有所帮助!
我有一个带有 HWIOauthBundle 的网站 (Symfony2) 用于连接 Facebook,一切正常。
现在,我正在尝试使用 Cordova 和 Ionic 框架 (AngularJS) 构建一个 iOS 应用程序,我想通过 Facebook 验证我的用户:
使用
$cordovaFacebook
,我验证我的用户并获得有效的 Facebook 访问令牌,没关系我尝试使用此访问令牌通过 HWIOauthBundle 在服务器端验证我的用户:
GET http://..../login/facebook?code=MY_FACEBOOK_ACCESS_TOKEN
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 实现服务器端登录。 我没有在网上找到任何解决方案,所以我根据我在网上阅读的提示对功能进行了编码。 基本上,您必须:
- 在您的应用程序上验证用户
- 使用 Facebook 令牌向您的服务器发出 http 请求。
- 在服务器端,检查令牌是否用于您的 Facebook 应用程序,并检索用户的 Facebook ID。
- 根据获取的 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,因为您将交换敏感信息。
我不知道这是否是最好的方法,但效果很好。 希望对您有所帮助!