首页 > 解决方案 > Yii 2 - authclient 不调用 onAuthSuccess

问题描述

我正在使用 Yii authclient 来使用社交登录。我已经按照文档中的定义设置了所有内容,但是当我尝试使用 google 登录时,它不会调用 onAuthSuccess 方法。当我尝试登录时,它只是将我重定向到returnUrl但未经过身份验证。这是我的代码;

配置/main.php

 'authClientCollection' => [
        'class' => \yii\authclient\Collection::class,
        'clients' => [
            'google' => [
                'class' => \yii\authclient\clients\Google::class,
                'clientId' => *********, //changed for issue purpose
                'clientSecret' => *********, //changed for issue purpose
                'returnUrl' => 'http://localhost/site/landing',
            ],
        ],
    ]

控制器/站点控制器

    public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['logout', 'signup', 'auth'],
            'rules' => [
                [
                    'actions' => ['signup', 'auth'],
                    'allow' => true,
                    'roles' => ['?'],
                ],
                [
                    'actions' => ['logout'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
                'create-storyboard' => ['post'],
            ],
        ],
    ];
}

/**
 * {@inheritdoc}
 */
public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
        ],
        'auth' => [
            'class' => 'yii\authclient\AuthAction',
            'successCallback' => [$this, 'onAuthSuccess'],
        ],
    ];
}

public function onAuthSuccess($client)
{
    (new AuthHandler($client))->handle();
}

标签: oauthyiiyii2yii2-advanced-appyii2-authclient

解决方案


如果您设置 returnUrl,则用户来自身份验证提供程序,直接重定向到您在该属性中设置的 url。

在您的情况下,returnUrl 说谷歌,它应该将用户重定向到http://localhost/site/landing. 但是您的站点/登陆操作中没有任何内容可以调用 onAuthSuccess。

您需要让用户在处理来自 OAuth 提供者的响应后返回站点/身份验证并重定向它们。为此,请从配置中删除 returnUrl。这将使 authclient 使用默认返回 url,这是启动 auth 过程的操作。

然后修改您的 onAuthSuccess 以将用户重定向到站点/登陆,如下所示:

public function onAuthSuccess($client)
{
    (new AuthHandler($client))->handle();
    $this->redirect(['site/landing']);
}

推荐阅读