php中基于令牌的身份验证

时间:2012-03-01 04:40:53

标签: php authentication rest

我的网络服务器上有一个REST服务,用php编写。我想知道,什么是最好的身份验证(除了基本的http访问身份验证)。 我听说过基于令牌的身份证,并且想问一下是否有人可以解释主要步骤。

  • 在GET上:令牌发送是否可见? (这不是不安全吗?)
  • 如何使令牌仅在特定时间内有效?
  • ...

客户端:Android /浏览器;服务器:Apache,PHP5

3 个答案:

答案 0 :(得分:12)

它可以以任何一种方式完成,并且GET请求中的值实际上不比POST请求中的值更可见。如果任何人可以“看到”(即拦截)请求,他可以看到您发送的所有内容。最后,HTTP请求只是一堆HTTP头,可能后跟一个正文。该URL在第一行GET /foo/bar HTTP/1.1行发送,其他值只在不同的行中发送。

因此,您需要发送身份验证令牌。您可以要求它是附加到每个请求的查询参数:

GET /foo/bar?user=123456&token=abcde...

要真正按照预期使用HTTP协议,您应该使用Authorization HTTP标头:

Authorization: MyScheme 123456:abcde...

此标题的内容完全取决于您。它通常指定一个授权方法,如Basic,然后是您想要进行身份验证的任何内容。这可以简单地是用户名和密码,它们的哈希值,客户端在某些时候或其他任何地方获得的不透明令牌。

我建议使用令牌系统或请求签名系统,后者是非常受欢迎的。在请求签名系统中,客户端必须从您那里获取令牌。然后,它发送该令牌的散列和请求的某些特征以验证该请求,例如, sha1(Token + Timestamp + Request URL + Request Body)。您的服务器可以验证这一点,而客户端不必在每个请求上以纯文本形式发送令牌。

  

如何使令牌仅在特定时间有效?

您使用到期时间戳保存令牌服务器端并检查它。

答案 1 :(得分:2)

这是关于基于令牌的身份验证的question。我认为今天最常见的基于令牌的身份验证是OAuth。但要回答你的问题:

  

在GET上:令牌发送是否可见? (这不是不安全吗?)

您可以通过HTTP标头传递令牌,这样就不会那么容易看到。 OAuth allows this。请注意,令牌仍然可见,它们不在GET查询参数中。

  

如何使令牌仅在特定时间有效?

由于您控制(创建)令牌,因此您可以为每个令牌设置到期日期。在您的API的每个请求中,如果给定令牌仍然有效,您应该只检查您的令牌存储(例如数据库)。如果不是,那么您可以中止请求(可能返回HTTP 401错误)。

答案 2 :(得分:1)

您可以使用基于Firefox的JWT(JSON Web令牌)进行基于令牌的身份验证。

1)通过运行composer命令安装php jwt composer require firebase / php-jwt

   require_once('vendor/autoload.php');
   use \Firebase\JWT\JWT; 
   define('SECRET_KEY','Your-Secret-Key')  // secret key can be a random string  and keep in secret from anyone
   define('ALGORITHM','HS512')

之后生成您的令牌

$tokenId    = base64_encode(mcrypt_create_iv(32));
                $issuedAt   = time();
                $notBefore  = $issuedAt + 10;  //Adding 10 seconds
                $expire     = $notBefore + 7200; // Adding 60 seconds
                $serverName = 'http://localhost/php-json/'; /// set your domain name 


                /*
                 * Create the token as an array
                 */
                $data = [
                    'iat'  => $issuedAt,         // Issued at: time when the token was generated
                    'jti'  => $tokenId,          // Json Token Id: an unique identifier for the token
                    'iss'  => $serverName,       // Issuer
                    'nbf'  => $notBefore,        // Not before
                    'exp'  => $expire,           // Expire
                    'data' => [                  // Data related to the logged user you can set your required data
                'id'   => "set your current logged user-id", // id from the users table
                 'name' => "logged user name", //  name
                              ]
                ];
              $secretKey = base64_decode(SECRET_KEY);
              /// Here we will transform this array into JWT:
              $jwt = JWT::encode(
                        $data, //Data to be encoded in the JWT
                        $secretKey, // The signing key
                         ALGORITHM 
                       ); 
             $unencodedArray = ['jwt' => $jwt];

向您的用户提供此令牌" $ jwt " 。在每个请求中,用户需要为每个请求发送令牌值以验证用户。

 try {
           $secretKey = base64_decode(SECRET_KEY); 
           $DecodedDataArray = JWT::decode($_REQUEST['tokVal'], $secretKey, array(ALGORITHM));

           echo  "{'status' : 'success' ,'data':".json_encode($DecodedDataArray)." }";die();

           } catch (Exception $e) {
            echo "{'status' : 'fail' ,'msg':'Unauthorized'}";die();
           }

You can get step by step full configurations for php token based authentication