首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何安全地实现“基于令牌的身份验证”来访问PHPFox开发的网站资源(即功能和数据)?

如何安全地实现“基于令牌的身份验证”来访问PHPFox开发的网站资源(即功能和数据)?
EN

Stack Overflow用户
提问于 2015-03-18 19:42:06
回答 1查看 83.1K关注 0票数 26

我想使用在PHPFox中开发的网站代码中的方法和资源。

基本上,我将接收来自iPhone/Android的请求,我将从PHPFox代码中获取请求并传递给相应的函数,从该函数获取响应并将其返回给设备。

为此,我使用超薄框架开发了REST。

但我目前面临的主要障碍是访问PHPFox网站的资源(即功能和数据)。

我不明白如何使用“基于令牌的身份验证”对用户进行身份验证,以便访问网站资源。

如果有人能用一些有用的工作例子来指引我正确的方向,那将对我真的很有帮助。

注:建议的“基于令牌的身份验证”的实现应该是非常安全和快速的。安全性不应该以任何方式受到损害。

以下是我自己尝试的代码,但我不知道它是对还是错。我的方法是正确还是错误。请有人分析它,让我知道你的反馈。

为了创建一个令牌,我使用这个函数,它接受用户的数据作为参数

代码语言:javascript
复制
define('SECRET_KEY', "fakesecretkey");

function createToken($data)
{
    /* Create a part of token using secretKey and other stuff */
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be 'stronger' of course

    /* Encoding token */
    $token = hash('sha256', $tokenGeneric.$data);

    return array('token' => $token, 'userData' => $data);
}

因此,用户可以对自己进行身份验证,并接收包含令牌(genericPart + his数据,已编码)和未编码的hisData的数组:

代码语言:javascript
复制
function auth($login, $password)
{
    // we check user. For instance, it's ok, and we get his ID and his role.
    $userID = 1;
    $userRole = "admin";

    // Concatenating data with TIME
    $data = time()."_".$userID."-".$userRole;
    $token = createToken($data);
    echo json_encode($token);
}

然后,用户可以向我发送他的令牌+他的未编码数据,以便检查:

代码语言:javascript
复制
define('VALIDITY_TIME', 3600);

function checkToken($receivedToken, $receivedData)
{
    /* Recreate the generic part of token using secretKey and other stuff */
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"];

    // We create a token which should match
    $token = hash('sha256', $tokenGeneric.$receivedData);   

    // We check if token is ok !
    if ($receivedToken != $token)
    {
        echo 'wrong Token !';
        return false;
    }

    list($tokenDate, $userData) = explode("_", $receivedData);
    // here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired
    // if token expired we return false

    // otherwise it's ok and we return a new token
    return createToken(time()."#".$userData);   
}

$check = checkToken($_GET['token'], $_GET['data']);
if ($check !== false)
    echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request

我说的对吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-03-21 00:31:32

首先,您应该了解什么是基于令牌的身份验证。它可以解释如下。

基于令牌的身份验证系统背后的一般概念很简单。允许用户输入其用户名和密码以获取令牌,该令牌允许用户获取特定资源,而无需使用其用户名和密码。一旦获得令牌,用户就可以将令牌提供给远程站点,该令牌在一段时间内提供对特定资源的访问。

Read more

现在让我们看看在REST web服务中实现它的步骤是什么。

它将使用以下控制流:

  • 用户在登录表单中提供用户名和密码,然后单击登录。
  • 发出请求后,通过在数据库中查询来在后端验证用户。如果请求有效,则使用从数据库获取的用户信息创建令牌,然后在响应头中返回该信息,以便我们可以将令牌浏览器存储在本地storage.
  • Provide中用于访问application.
  • If中受限制端点的每个请求头中的令牌信息从请求头信息中获取的令牌有效,让用户访问指定的端点,并使用JSON或XML进行响应。

请参阅下图了解控制流程

您可能想知道什么是JWT

JSON JWT代表JSON Web Token,是在授权头部中使用的一种令牌格式。此令牌可帮助您以安全的方式设计两个系统之间的通信。出于本教程的目的,让我们将JWT重新表述为“持有者令牌”。持有者令牌由三个部分组成:头部、负载和签名。

  • 报头是令牌的一部分,用于保存以base64编码的令牌类型和加密方法。
  • 有效负载包括该信息。您可以放置任何类型的数据,如用户信息、产品信息等,所有这些数据也存储在由头、有效负载和密钥组合组成的encoding.
  • The签名base64中。密钥必须安全地保存在服务器端。您可以在下面看到JWT模式和一个示例令牌:

您不需要实现承载令牌生成器,因为您可以使用php-jwt

希望上面的内容能解释你的困惑。如果您在实现基于令牌的身份验证时遇到任何问题,请让我知道。我可以帮你。

票数 83
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29121112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档