/** * Logs the user in if this social account has been already used. Otherwise shows registration form. * @param ClientInterface $client * @return \yii\web\Response */ public function authenticate(ClientInterface $client) { $attributes = $client->getUserAttributes(); $provider = $client->getId(); $clientId = $attributes['id']; $account = UserAccount::find()->where(['provider' => $provider, 'client_id' => $clientId])->one(); if ($account === null) { $account = \Yii::createObject(['class' => UserAccount::className(), 'provider' => $provider, 'client_id' => $clientId, 'data' => json_encode($attributes), 'created_at' => time()]); $account->save(false); } if (null === ($user = $account->user)) { $this->action->successUrl = Url::to(['/site/connect', 'account_id' => $account->id]); } else { \Yii::$app->user->login($user, 1209600); // two weeks } }
/** * 绑定第三方账号 * @param ClientInterface $client * @return \yii\web\Response */ public function connect(ClientInterface $client) { $attributes = $client->getUserAttributes(); $provider = $client->getId(); $clientId = $attributes['id']; $account = $this->finder->findAccountByProviderAndClientId($provider, $clientId); if ($account === null) { $account = Yii::createObject(['class' => UserAccount::className(), 'provider' => $provider, 'client_id' => $clientId, 'data' => json_encode($attributes), 'user_id' => Yii::$app->user->id, 'created_at' => time()]); $account->save(false); Yii::$app->session->setFlash('success', '账号绑定成功'); } else { Yii::$app->session->setFlash('error', '绑定失败,此账号已经绑定过了'); } $this->action->successUrl = Url::to(['/user/setting/networks']); }
/** * @return Account[] Connected accounts ($provider => $account) */ public function getAccounts() { $connected = []; $accounts = $this->hasMany(UserAccount::className(), ['user_id' => 'id'])->all(); // @var Account $account foreach ($accounts as $account) { $connected[$account->provider] = $account; } return $connected; }