Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii2 authclient未返回用户的电子邮件id_Yii2_Yii Components_Yii2 Advanced App - Fatal编程技术网

Yii2 authclient未返回用户的电子邮件id

Yii2 authclient未返回用户的电子邮件id,yii2,yii-components,yii2-advanced-app,Yii2,Yii Components,Yii2 Advanced App,我使用yii2authclient在facebook上登录我的网站,我得到的回复如下 yii\authclient\clients\Facebook Object ( [authUrl] => https://www.facebook.com/dialog/oauth?display=popup [tokenUrl] => https://graph.facebook.com/oauth/access_token [apiBaseUrl] => https://graph.fa

我使用yii2authclient在facebook上登录我的网站,我得到的回复如下

yii\authclient\clients\Facebook Object ( [authUrl] => https://www.facebook.com/dialog/oauth?display=popup [tokenUrl] => https://graph.facebook.com/oauth/access_token [apiBaseUrl] => https://graph.facebook.com [scope] => email [version] => 2.0 [clientId] => *******[clientSecret] => ********[_returnUrl:yii\authclient\BaseOAuth:private] => http://www.usermodule.com/index.php?r=site%2Fauth&authclient=facebook [_curlOptions:yii\authclient\BaseOAuth:private] => Array ( ) [_accessToken:yii\authclient\BaseOAuth:private] => yii\authclient\OAuthToken Object ( [tokenParamKey] => access_token [tokenSecretParamKey] => oauth_token_secret [createTimestamp] => 1436772538 [_expireDurationParamKey:yii\authclient\OAuthToken:private] => [_params:yii\authclient\OAuthToken:private] => Array ( [access_token] => ****************************** [expires] => 5182933 ) ) [_signatureMethod:yii\authclient\BaseOAuth:private] => Array ( ) [_id:yii\authclient\BaseClient:private] => facebook [_name:yii\authclient\BaseClient:private] => [_title:yii\authclient\BaseClient:private] => [_userAttributes:yii\authclient\BaseClient:private] => [_normalizeUserAttributeMap:yii\authclient\BaseClient:private] => [_viewOptions:yii\authclient\BaseClient:private] => [_events:yii\base\Component:private] => Array ( ) [_behaviors:yii\base\Component:private] => ) Array ( [name] => **** [id] => *****)
这是我的配置

 'authClientCollection' => [
    'class' => 'yii\authclient\Collection',
    'clients' => [
        'facebook' => [
            'class' => 'yii\authclient\clients\Facebook',              
            'clientId' => '***',
            'clientSecret' => '****',

        ],
    ],
]
我可以获取用户名、用户id但不能获取用户电子邮件id为什么?我还应该做什么

    for using Yii2-authclient you have to configure(main.php) like that:-
    inside components array write
    'authClientCollection' => [
            'class' => 'yii\authclient\Collection',
            'clients' => [
                'facebook' => [
                    'class' => 'yii\authclient\clients\Facebook',
                    'clientId' => 'your Client-Id',
                    'clientSecret' => 'your Client-secret',
                ],

            ],
        ],
    in controller inside actions method write:-
    auth' => [
                'class' => 'yii\authclient\AuthAction',
                'successCallback' => [$this, 'successCallback'],
                 ],

then create successCallback function like
public function successCallback($client)
        {
            $attributes= $client->getUserAttributes();
            print_r($attributes);
} 
then you got all attributes which are shared by Facebook(like email, firstname etc).
这就够了。但有时您仍然无法获取电子邮件地址,因为某些facebook用户没有电子邮件地址:

  • facebook用户通过电话注册
  • facebook用户通过电子邮件注册,但未验证电子邮件
您必须捕获它才能通知用户。

我不知道还有什么例外。如果用户有一封电子邮件,但您的应用程序无法获取该电子邮件地址,让我们在facebook开发者的“状态和审核”页面中查看列表中的
电子邮件
权限

是的,终于找到了解决办法

当您发出graph api请求时

$this->makeSignedRequest('me');
换成

$this->makeSignedRequest('me?fields=id,name,email');
要么你正在使用facebook sdk,要么像我一样使用Yi2 eauth扩展。 如果您使用的是yii2eauth,则需要在vendor/nodge/yii2eauth/src/services/facebookouth2service.php中对此进行更改

然后将此行添加到“读取电子邮件”属性

$this->attributes['email'] = $info['email'];
注:我试着用yii的方式传递论点,比如

$this->makeSignedRequest('me',array('fields'=>'id,email');
不适合我

解决方案来源:
在上述解决方案的帮助下,我得到了解决方案

在yii2 authclient/clients/Facebook.php中有一个函数initUserAttributes(),其中

 return $this->api('me', 'GET');
换成

 return $this->api('me?fields=id,name,email', 'GET');

yii2 eauth扩展确实存在一些错误

首先在web.php中设置范围参数

            'facebook' => array(
                // register your app here: https://developers.facebook.com/apps/
                'clientId' => '454208034652365',
                'clientSecret' => '0e7161949129d4120cc5ac7d79f89098',
                'class' => 'nodge\eauth\services\FacebookOAuth2Service',
                'scope'        => [
                    'email'
                    ]
            ),
那么你能像下面这样使用吗

  $info = $eauth->makeSignedRequest('me', [
                'query' => [
                    'fields' => join(',', [
                        'id',
                        'name',
                        'link',
                        'email'
                    ])
                ]
            ]);
            echo $info['email'];

请再次阅读我的问题,我收到了facebook的回复,我在问题中分享了这些回复,但我没有收到电子邮件。请用给定的解决方案替换您的配置,然后选中完成!我得到的响应是数组([name]=>*****[id]=>*****)。没有电子邮件。你是否在developers.facebook.com上注册你的应用程序?是的,我还有其他问题,我甚至没有收到正确的回复。我有fb帐户的电子邮件Id,我用我的朋友帐户进行了测试。同样,没有电子邮件回复。已批准的项目电子邮件、公共配置文件、用户朋友显示默认已批准。轻松修改传递的参数,它将起作用
$info=$this->makeSignedRequest('me',数组('query'=>数组('fields'=>'email,name,birth,gender,link,first_name,last_name,age_range',)何时调用$this->makeSignedRequest?站点控制器?
  $info = $eauth->makeSignedRequest('me', [
                'query' => [
                    'fields' => join(',', [
                        'id',
                        'name',
                        'link',
                        'email'
                    ])
                ]
            ]);
            echo $info['email'];