我有 symfony2网站以及通过iOS应用程序可通过 oauth使用FOSOAuthServerBundle 保护的网络服务。在网站上我使用 FOSUserBundle 和 FOSFacebookBundle 。
我唯一想念的是让用户可以在iOS应用程序上登录facebook,并为我的oauth返回一个access_token,链接到他的用户帐户,以便他可以像其他用户一样访问我的api。
所以基本上我想将用户facebookID和facebook_access_token 发送到我的网络服务,检查用户是否正确(令牌与我的应用匹配)和返回身份验证令牌。
问题:有一种简单的方法可以将“Facebook”grant_type添加到FOSOAuthServerBundle吗?
我知道有些人已经看到了这些问题:
Design for Facebook authentication in an iOS app that also accesses a secured web service
Get application id from user access token (or verify the source application for a token)
但他们没有解释如何,他们似乎没有使用FOSOauthServerBundle而且问题已经很老了。
我尝试过使用此捆绑包: https://github.com/TheFootballSocialClub/FSCOAuth2FacebookGrantBundle
但是这个捆绑包在我之前只下载了9次并且不完全适合我的应用程序(它认为Facebook用户的用户名等于他的facebookId)。所以我想我想要做的就是以自己的方式重新实现同样的事情。
如果有人已经这样做,我们可以提供任何指导,我们将非常感激。
谢谢
答案 0 :(得分:2)
要执行此操作,您必须添加Grant Extensions,请参阅官方文档“添加Grant Extensions”:https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/blob/master/Resources/doc/adding_grant_extensions.md
您可以找到我的FacebookGrantExtension以从FB access_token获取令牌:
class FacebookGrantExtension implements GrantExtensionInterface
{
protected $userManager = null;
protected $facebookSdk = null;
public function __construct(UserManager $userManager, \BaseFacebook $facebookSdk)
{
$this->userManager = $userManager;
$this->facebookSdk = $facebookSdk;
}
/**
* @see OAuth2\IOAuth2GrantExtension::checkGrantExtension
*/
public function checkGrantExtension(IOAuth2Client $client, array $inputData, array $authHeaders)
{
if (!isset($inputData['facebook_access_token'])) {
return false;
}
$this->facebookSdk->setAccessToken($inputData['facebook_access_token']);
try {
// Try to get the user with the facebook token from Open Graph
$fbData = $this->facebookSdk->api('/me');
if (empty($fbData) || !isset($fbData['id'])) {
return false;
}
// Check if a user match in database with the facebook id
$user = $this->userManager->findUserBy(array(
'facebookId' => $fbData['id']
));
// If no user found, register a new user and grant token
if (null === $user) {
return false;
}
// Else, return the access_token for the user
else {
return array(
'data' => $user
);
}
} catch(\FacebookApiExceptionion $e) {
return false;
}
}
}
和config.yml:
my.oauth.facebook_extension:
class: My\CoreBundle\Oauth\FacebookGrantExtension
arguments:
userManager: "@fos_user.user_manager"
facebookSdk: "@fos_facebook.api"
tags:
- { name: fos_oauth_server.grant_extension, uri: 'http://grants.api.mywebsite.com/facebook_access_token' }