0

我正在尝试public function loadUserByOAuthUserResponse(UserResponseInterface $response)在 HWIOAuthBundle 中实现该方法。当用户登录他的 facebook 帐户时,我注意到getNickname()即使为该用户指定了它,它也始终返回 null。

这正常吗?

public function loadUserByOAuthUserResponse(UserResponseInterface $response) {

    $username = $response->getUsername();
    $nickname= $response->getNickname(); // it returns always null
    //$user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
    $user = $this->userManager->findUserBy(array("email" => $response->getEmail()));
    $attr = $response->getResponse();


    //when the user is registrating
    if (null === $user) {
        // init some setter functions
        $service = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($service);
        $setter_id = $setter . 'Id';
        $setter_token = $setter . 'AccessToken';

        // create new user here indepently of which service we are using!
        $user = $this->userManager->createUser();
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());

        $user->setUsername($response->getUsername());
        //$user->setUsernameCanonical($response->getNickname());
        $user->setEmail($response->getEmail());
        $user->setEmailCanonical($response->getEmail());


        switch ($service) {
            case 'facebook':
                if (isset($attr['gender'])) {
                    if ($attr['gender'] == 'male')
                        $user->setGender(true);
                    else
                        $user->setGender(false);
                }
                if (isset($attr['first_name'])) {
                    $user->setName($attr['first_name']);
                }
                if (isset($attr['last_name'])) {
                    $user->setFamilyname($attr['last_name']);
                }
                if (isset($attr['location'])) {
                    if (isset($attr['location']['name'])) {
                        if ($attr['location']['name']) {
                            $user->setLocation($attr['location']['name']);
                        }
                    }
                }
                if (isset($attr['hometown'])) {
                    if (isset($attr['hometown']['name'])) {
                        if ($attr['hometown']['name']) {
                            $user->setHometown($attr['hometown']['name']);
                        }
                    }
                }
                if (isset($attr['birthday'])) {
                    $user->setBirthday(new \DateTime($attr['birthday']));
                }
                if ($nickname) {
                    $user->setPassword("aa" . $nickname);
                }else $user->setPassword($attr['name']);
                break;
            case 'google':
                // not ready yet!
                break;
        }
        $user->setAccept(true);
        $user->setEnabled(true);

        // update the user here
        $this->userManager->updateUser($user);
        return $user;
    }

    //if user exists - go with the HWIOAuth way
    $user = parent::loadUserByOAuthUserResponse($response);

    $serviceName = $response->getResourceOwner()->getName();
    $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

    //update access token
    $user->$setter($response->getAccessToken());

    return $user;
}
4

1 回答 1

2

看看我在Omniauth-facebook hash not show Facebook 'username' field, using rails 3 上的回答它是关于另一种语言/库的,但其背后的失败原因是一样的。

错误在这里:https ://github.com/hwi/HWIOAuthBundle/blob/master/OAuth/ResourceOwner/FacebookResourceOwner.php#L29

于 2014-05-27T14:26:39.853 回答