【问题标题】:Yii 2 - authclient doesn't call onAuthSuccessYii 2 - authclient 不调用 onAuthSuccess
【发布时间】:2019-09-17 12:02:58
【问题描述】:

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

config/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();
}

【问题讨论】:

    标签: oauth yii yii2 yii2-advanced-app yii2-authclient


    【解决方案1】:

    如果您设置 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']);
    }
    

    【讨论】:

    • 您好 Michael,感谢您的回复,但删除 returnUrl 会导致 redirect_uri_mismatch 错误。它应该在主配置中可用。还有其他想法吗?
    • 这可能是因为在 google 的 api 控制台中设置的授权重定向 uri 与 auth 操作使用的不匹配。您可能已将其设置为 http://localhost/site/landing,但您需要添加 auth 操作使用的 url。应该是http://localhost/site/auth?authclient=google
    • 我刚刚解决了这个问题,谢谢 Michal,感谢您的帮助。
    【解决方案2】:

    在@Michal Hynčica 的帮助下,我已经解决了这个问题。问题出在我的 returnUrl 中,这意味着它必须遵循身份验证 url 来进行身份验证,而不是身份验证后的重定向。所以我需要做的就是将其更改为如下所示。

        'returnUrl' => 'http://localhost/site/auth?authclient=google'
    

    也不要忘记将相同的 returnUrl 添加到您的谷歌控制台的重定向 url。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多