6

ログインシステムに google oauth2 api を使用しようとしています。それはほとんど機能しており、ユーザーは私の Web アプリケーションへのアクセスを許可し、私は情報を読み、ユーザーを接続します。問題は、彼らがブラウザを離れるか変更すると、私のウェブサイトに戻ると、アクセスを許可するように再度求められることです。

ユーザーのチェックイン以外に API 呼び出しを使用していないため、オフライン アクセスは必要ありません。とにかく私は立ち往生していて、そこに助けが必要です!

Google php ライブラリ (https://code.google.com/p/google-api-php-client/wiki/OAuth2) を使用しており、ApprovalPrompt を auto に設定しています。まだ運がありません。

私のコード:

public function googleLogin()
{
    $this->set('connect', "Google login");
    $client = new apiClient();
    $client->setApprovalPrompt('auto');
    $client->setApplicationName("Authentication");
    $client->setClientId(G_OAUTH2_APP_ID);
    $client->setClientSecret(G_OAUTH2_SECRET);
    $client->setRedirectUri(G_REDIRECT_URI);
    $client->setDeveloperKey(G_DEV_KEY);
    $oauth2 = new apiOauth2Service($client);

    if (isset($_GET['code'])) {
        $client->authenticate();
        $_SESSION['token'] = $client->getAccessToken();
        $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
        header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));

    }

    if (isset($_SESSION['token'])) {
        $client->setAccessToken($_SESSION['token']);
    }

    if (isset($_REQUEST['logout'])) {
        unset($_SESSION['token']);
        $client->revokeToken();
    }
    //print_r($client->getAccessToken()); exit;

    if ($client->getAccessToken()) {
        $user = $oauth2->Guserinfo->get();


        // These fields are currently filtered through the PHP sanitize filters.
        // See http://www.php.net/manual/en/filter.filters.sanitize.php
        //$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
        //$img = filter_var($user['picture'], FILTER_VALIDATE_URL);

        // The access token may have been updated lazily.
        $_SESSION['token'] = $client->getAccessToken();

        //do stuff with user data
        $data = $this->linkUser($user, "google");
        if ($data['state']=="createUser") {
            $this->set("data",$data);
        }

    } else {
        $authUrl = $client->createAuthUrl();
        header("Location: " . $authUrl);
    }
}

編集:$client->setAccessType("online"); これが機能させるために必要な唯一のことなのか、それともブラウザー/OS間にバグがあるのか​​、まだわからない 行を追加しました:前回ライオン/クロームで試したときは機能しませんでしたでもw7/firefoxでは大丈夫です。まあ、これか私は単に私の心を失っています:p

4

5 に答える 5

11

ここでの別の質問:GoogleAPI-毎回許可を与えるように強制する

誰かがあなたがこれを行うことができると指摘しました:

$client->setApprovalPrompt('auto');

于 2013-01-08T10:14:44.263 に答える
3

$client->revokeToken() を排除して解決したと思われる同様の問題があり、ログインの前にログアウトのものを移動しました。

トークンの無効化を回避することが有効かどうかはわかりませんが、うまくいくようです。

これを試してください:

public function googleLogin()
{
    $this->set('connect', "Google login");
    $client = new apiClient();
    $client->setApprovalPrompt('auto');
    $client->setApplicationName("Authentication");
    $client->setClientId(G_OAUTH2_APP_ID);
    $client->setClientSecret(G_OAUTH2_SECRET);
    $client->setRedirectUri(G_REDIRECT_URI);
    $client->setDeveloperKey(G_DEV_KEY);
    $oauth2 = new apiOauth2Service($client);

    // I moved the logout stuff here, without invalidating the token
    if (isset($_REQUEST['logout'])) {
        unset($_SESSION['token']);            
    }

    if (isset($_GET['code'])) {
        $client->authenticate();
        $_SESSION['token'] = $client->getAccessToken();
        $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
        header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));

    }

    if (isset($_SESSION['token'])) {
        $client->setAccessToken($_SESSION['token']);
    }

    /* // I solved getting this stuf commented
    if (isset($_REQUEST['logout'])) {
        unset($_SESSION['token']);
        $client->revokeToken();
    }*/
    //print_r($client->getAccessToken()); exit;

    if ($client->getAccessToken()) {
        $user = $oauth2->Guserinfo->get();


        // These fields are currently filtered through the PHP sanitize filters.
        // See http://www.php.net/manual/en/filter.filters.sanitize.php
        //$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
        //$img = filter_var($user['picture'], FILTER_VALIDATE_URL);

        // The access token may have been updated lazily.
        $_SESSION['token'] = $client->getAccessToken();

        //do stuff with user data
        $data = $this->linkUser($user, "google");
        if ($data['state']=="createUser") {
            $this->set("data",$data);
        }

    } else {
        $authUrl = $client->createAuthUrl();
        header("Location: " . $authUrl);
    }
}
于 2012-09-11T23:16:21.617 に答える
0

ユーザーがアプリへのアクセスを初めて許可したときに取得した更新トークンをデータベースに保存し、将来のリクエストで再利用する必要があります。

GoogleドライブSDKのドキュメントには、そのフローを実装し、参照として使用できるサンプルPHPアプリケーションが含まれています。

https://developers.google.com/drive/examples/php

于 2012-09-05T08:10:20.777 に答える
0

あなたの問題は、ユーザーのコンピューターにCookieを保存していないことだと思います。セッションは、ユーザーがWebサイトにいる間だけ情報を保存します。

これは、Cookieに関する簡単な説明です。それが役に立てば幸い。

http://www.tizag.com/phpT/phpcookies.php

于 2012-09-05T08:11:27.500 に答える
0

オフライン アクセスを設定します。認証する各ユーザーの初期トークンと更新トークンを保存すると、ユーザーがどこからアプリにログインしても、常に Google アカウントに接続されます。Google 自体に直接ログインしていなくても、Google にログインします。あなたのアプリを通して。

上記のように、これはドキュメントでカバーされています。

ユーザーがこれを行うことができなければ、API を用意しても意味がありません。また、Cookie やセッションとは関係ありません。サーバー IP を Google 開発者コンソールに追加すれば問題ありません。

于 2015-04-13T19:11:02.120 に答える