4

symfony2 Web サイトと、iOS アプリからアクセスできるFOSOAuthServerBundle を使用して oauthで保護された Web サービスがあります。ウェブサイトではFOSUserBundleFOSFacebookBundleを使用しています。

私が見逃している唯一のことは、ユーザーが iOS アプリで facebook にログインし、ユーザー アカウントにリンクされた私の oauth の access_token を返して、他のユーザーと同じように私の API にアクセスできるようにすることです。

したがって、基本的には、ユーザーの facebookID と facebook_access_tokenを Web サービスに送信し、ユーザーが正しい (トークンがアプリと一致する) ことを確認し、認証トークンを返します

質問: "Facebook" grant_type を FOSOAuthServerBundle に追加する簡単な方法はありますか?

一部の人々がこれらの質問を見てこれを行ったことを私は知っています:

しかし、彼らはその方法を説明しておらず、FOSOauthServerBundle を使用していないようで、質問はかなり古いものです。

このバンドルを使用してみました: https://github.com/TheFootballSocialClub/FSCOAuth2FacebookGrantBundle

しかし、このバンドルは私の前に 9 回しかダウンロードされておらず、私のアプリには完全には適していません (たとえば、Facebook ユーザーのユーザー名は彼の facebookId と等しいと見なされます)。だから私がやりたいのは、同じようなことを自分のやり方で再実装することだと思います。

誰かがすでにそれを行っている場合は、私たちがガイダンスを提供できることを非常に感謝しています.

ありがとうございました

4

1 に答える 1

2

これを行うには、Grant 拡張機能を追加する必要があります。公式ドキュメント「Adding Grant Extensions」を参照してください: https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/blob/master/Resources/doc/adding_grant_extensions.md

FB access_token からトークンを取得するために、私の FacebookGrantExtension を見つけることができます:

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' }
于 2013-09-11T15:46:23.297 に答える