FOSUserBundle + HWIOAuthBundle を使用していますが、アクセストークンが 1 時間後に期限切れになるという問題があります。ここでは、ログインするたびにアクセス トークンを db に保存しています。アクセス トークンを更新してデータベースを更新するにはどうすればよいですか? これに関する文書はありますか?
質問する
987 次
1 に答える
1
私は最近この問題に遭遇しました!保存されたアクセス トークンを使用して連絡先を取得していました。
連絡先を取得するサービスでは、現在保存されているトークンを使用して試行し、それがうまくいかない場合は、ユーザーの更新トークンを利用して新しいアクセス トークンを生成します。
私の旅行はこのようなセットアップに私を導きましたが、サインアップ時に更新トークンをキャプチャしませんでした. だから、それを理解するまで、私はうきうきしていました。
さらに、その更新トークンにアクセスする場合は、HWIOauth で Google リソースを定義するときに、スコープで「オフライン」アクセスを要求する必要があります。
連絡先検索サービス:
<?php
namespace Acme\DemoBundle\Services;
use Acme\DemoBundle\Entity\User;
class GoogleContactRetriever
{
private $user;
private $buzz;
public function __construct($buzz, $googleId, $googleSecret, $userProvider)
{
$this->buzz = $buzz;
$this->googleId = $googleId;
$this->googleSecret = $googleSecret;
$this->userProvider = $userProvider;
}
public function setUser($user)
{
$this->user = $user;
}
public function requestContacts()
{
return $this->buzz->get( "https://www.google.com/m8/feeds/contacts/default/full?access_token=".$this->user->getGoogleAccessToken() );
}
public function retrieveUserContacts()
{
$response = $this->requestContacts();
$headers = $response->getHeaders();
if ($headers[0] != 'HTTP/1.0 200 OK') {
$this->refreshAccessToken($this->user);
$response = $this->requestContacts();
}
return $this->parseResponseString($response->getContent());
}
// ...
public function refreshAccessToken($user)
{
$refreshToken = $user->getGoogleRefreshToken();
$response = $this->buzz->post( "https://accounts.google.com/o/oauth2/token", array(),
"refresh_token=$refreshToken&client_id={$this->googleId}&client_secret={$this->googleSecret}&grant_type=refresh_token"
);
$responseContent = json_decode($response->getContent());
$this->userProvider->updateGoogleAccessToken($user, $responseContent->access_token);
}
}
FOSUBプロバイダ
<?php
namespace NYW\Bundle\CoreBundle\Security\Core\User;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;
class FOSUBUserProvider extends BaseClass
{
/**
* {@inheritdoc}
*/
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$serviceName = $response->getResourceOwner()->getName();
$avatar = null;
$username = $response->getUsername();
$email = $response->getEmail();
$user = $this->userManager->findUserByEmail($email);
//when the user is registrating
if (null === $user) {
$service = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($service);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
// create new user here
$user = $this->userManager->createUser();
$user->$setter_id($email);
$user->$setter_token($response->getAccessToken());
switch ($service) {
case 'google':
$refreshToken = $response->getRefreshToken();
$user->setGoogleRefreshToken($refreshToken);
break;
}
//I have set all requested data with the user's username
//modify here with relevant data
$user->setUsername($username);
$user->setEmail($email);
$user->setPassword($email);
$user->setEnabled(true);
$this->userManager->updateUser($user);
return $user;
}
//We used to call the parent's loadUserByOAuthUserResponse method here..
$setter = 'set' . ucfirst($serviceName) . 'AccessToken';
//update access token
$user->$setter($response->getAccessToken());
return $user;
}
public function updateGoogleAccessToken($user, $token)
{
$user->setGoogleAccessToken($token);
$this->userManager->updateUser($user);
}
}
config.yml
services:
adb.user_provider:
class: "Acme\DemoBundle\Security\Cure\FOSUBUserProvider"
arguments: [@fos_user.user_manager,{facebook: facebook_id, google: google_id}]
hwi_oauth:
connect:
account_connector: adb.user_provider
resource_owners:
google:
scope: "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.google.com/m8/feeds"
于 2014-05-06T11:35:59.350 に答える