9

1つのメインドメイン:main.com、サブドメイン:test1.main.comtest2.main.comおよび他のドメインone.comtwo.com

これで、次のようになりました。

ini_set("session.cookie_domain", ".main.com");

$domain = 'main.com';

login.php

$user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?", 
array($email, $password), "rowassoc");

if($user)
{
  $_SESSION['user_id'] = $user['id'];
  $_SESSION['user_name'] = $user['login'];

  $time = 100000; 

  setcookie('email', $email, time() + $time, "/", "." . $domain);
  setcookie('password', $password, time() + $time, "/", "." . $domain);

  header('Location: http://' . $user['login'] . "." . $domain);
  exit;
}

各ページに追加:

if(!isset($_SESSION['user_id']))
{
  if(isset($_COOKIE['email']) && isset($_COOKIE['password']))
  {
    $email = $_COOKIE['email'];
    $password = $_COOKIE['password'];

    $user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?",
    array($email, $password), "rowassoc");

    if($user)
    {
      $_SESSION['user_id'] = $user['id'];
      $_SESSION['user_name'] = $user['login'];
    }
  }
}
else
{
  $user = $db->query("SELECT id, login FROM users WHERE id=?", 
  array($_SESSION['user_id']), "rowassoc");


  if(!$user)
  {
    setcookie('email', '', time() , "/", "." . $domain);
    setcookie('password', '', time() , "/", "." . $domain);
    unset($_SESSION['user_id']);

    session_destroy();
    setcookie("PHPSESSID","",time(), "/", "." . $domain);
  }
  else
  {
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['user_name'] = $user['login'];
  }
}

logout.php

if(isset($_SESSION['user_id']))
{
  setcookie('email', '', time() , "/", "." . $domain);
  setcookie('password', '', time() , "/", "." . $domain);
  unset($_SESSION['user_id']);
  unset($_SESSION['user_name']);

  session_destroy();
  setcookie("PHPSESSID","",time(), "/", "." . $domain);

  header('Location: /main');
  exit;
}

ただし、ドメインmain.comとそのサブドメインでtest1.main.comのみ機能しますtest2.main.com

どういうわけかセッションと他のドメインを保存する必要がありますone.comtwo.com

安全な認証を行うための最善の方法、解決策がある場合、私は本当に混乱しています、例を挙げて教えてください。

4

3 に答える 3

12

私の知る限り、サブドメイン間のセッションの交差は問題ありませんが、まったく新しいドメインに引き継がれることはありません。そのためには、ある種の一元化されたデータメソッドまたはAPIが必要です。

データベース方式: domain2.comがdomain1.comのデータベースにアクセスできるように、リモートMySQLデータアクセスを作成する必要があります。ログインを実行するときは、新しいセッションを作成するだけでなく、一意のログイントークン(有効期限付き)をmysqlデータベースに配置する必要があります。ここで、domain1.comからdomain2.comに移動するすべてのリンクについて、ランダムに生成されたセッションIDを含む$ _GET変数を追加する必要があります(md5ハッシュで十分です)。domain2.comは、訪問者を受け取ると、$ _ GET変数を取得し、それをMySQLデータベースで実行してログイントークンを見つけます。一致するものがある場合は、そのユーザーがログオンしていると見なします(おそらく、$_COOKIEを次のように埋め込みます。ログインデータを保存するのに適しています)。これにより、2つの完全に異なるドメイン間でログインを転送できるようになります。

APIメソッド:APIメソッドを作成する必要があります。これにより、domain1.comは、承認されたドメインからの外部リクエストに応答して、ユーザーが転送されたときにログイントークンを取得できます。この方法では、domain1.comからdomain2.comに向かうすべてのリンクに、一意のセッションハッシュを渡すための$_GET変数を追加する必要もあります。次に、訪問者を受け取ると、domain2.comはdomain1.com/userapi.php(またはファイルを呼び出すもの)に対してcurl()リクエストを実行し、変数をデータベースの内容に対してテストする必要があります。

これは私が説明できる最善の方法です。これをコードで書き出すことは重要な作業であるため、コミットできません。しかし、あなたのコードから判断すると、あなたはPHPを非常によく理解しているので、これをやってのけると確信しています!

頑張ってください。

于 2010-11-03T22:27:10.450 に答える
2

セッションを複数のドメインにまたがって実行するには、 session_set_cookie_params()を使用する必要があります。これで、ドメインを指定できます。例えば...

session_set_cookie_params(10000, "/", ".main.com");

これにより、サイトルートの下のすべてのドキュメントとmain.comのすべてのサブドメインのセッションタイムアウトが10,​​000秒に設定されます。

session_set_cookie_params()する前に電話する必要がありますsession_start()

于 2010-11-03T22:18:48.683 に答える
2

しかし、ユーザーがドメインone.comに直接アクセスした場合、one.comは、ユーザーが上記の正解でログインしたかどうかを知ることができず、追加のjsを使用する必要があるようです。これはjsonPです。account.main.com/userLoginStat.php?callback=loginThisDomainを使用して、ユーザーがmain.comにログインしているかどうかを確認します。ログインしている場合は、jsコールバック関数loginThisDomainがユーザーをone.comに自動ログインします。

于 2012-06-04T06:09:07.140 に答える