JWT:slim v3 和 Android 中的身份验证
Posted
技术标签:
【中文标题】JWT:slim v3 和 Android 中的身份验证【英文标题】:JWT: Authentication in slim v3 and Android 【发布时间】:2016-06-15 10:46:42 【问题描述】:我正在使用 Slim 框架将 JSON 返回到我的 android 设备。我目前正在我的设备上登录。我使用 3 种不同的登录方式:Facebook、Google 和帐户登录。当他进行帐户登录时,他可以注册一个新帐户或使用现有帐户登录。
为了我的网络服务的安全性,我想使用 JWT 安全性。因此,我正在阅读和观看有关其工作原理的视频。我想我理解它是如何工作的,但我找不到任何关于如何正确实现它的信息。
我用于 slim v3 的中间件称为:Slim-JWT-Auth。 我发现following link 在我的苗条框架中实现了这一点,我认为它可以正常工作。
现在我的问题:
-
如何生成我的令牌?
什么时候生成我的令牌?
使用 Google 或 Facebook 登录时是否还需要令牌?因为他们已经使用了 Auth2.0 令牌?
我了解它的工作原理,但没有人谈论何时以及如何实施它。那么我什么时候需要生成令牌(在登录网络服务时?),我需要在每次启动应用程序后生成一个令牌,还是只需要等到令牌过期?
【问题讨论】:
如果您需要更多信息或样品,请告诉我。 我认为您应该在用户通过帐户登录时生成令牌(如果她使用 Google 或 Facebook 登录,您应该通过调用一些 Google/Facebook API 来验证其有效性,我猜) ,将其传递给客户端(例如会话 cookie)并对其进行验证以确保其有效。对于问题 2,您可以使用几个 php 库之一来生成 JWT(检查 jwt.io),并且您不得在令牌中包含敏感数据,因为它未加密(它只是 Base64URL 编码的) 【参考方案1】:如何生成我的令牌?
由于中间件已经包含 firebase/php-jwt 库,您可以使用它来生成令牌。
$now = new DateTime();
$future = new DateTime("now +2 hours");
$server = $request->getServerParams();
$payload = [
"iat" => $now->getTimeStamp(),
"exp" => $future->getTimeStamp(),
"sub" => $server["PHP_AUTH_USER"]
];
$secret = "supersecretkeyyoushouldnotcommittogithub";
$token = JWT::encode($payload, $secret, "HS256");
什么时候生成我的令牌?
例如,在您的 api 中,您可以包含一个受密码保护的路由,该路由会返回令牌。除了 /token
之外的所有其他路由都经过 JWT 身份验证。客户端可以在每次请求时都请求令牌,或者总是在旧请求过期之前位。
$app->add(new \Slim\Middleware\HttpBasicAuthentication([
"path" => "/token",
"users" => [
"test" => "test"
]
]);
$app->add(new \Slim\Middleware\JwtAuthentication([
"secret" => "supersecretkeyyoushouldnotcommittogithub"
"rules" => [
new RequestPathRule([
"path" => "/",
"passthrough" => ["/token"]
])
]
]);
$app->post("/token", function ($request, $response, $arguments)
$now = new DateTime();
$future = new DateTime("now +2 hours");
$server = $request->getServerParams();
$payload = [
"iat" => $now->getTimeStamp(),
"exp" => $future->getTimeStamp(),
"sub" => $server["PHP_AUTH_USER"],
];
$secret = "supersecretkeyyoushouldnotcommittogithub";
$token = JWT::encode($payload, $secret, "HS256");
$data["status"] = "ok";
$data["token"] = $token;
return $response->withStatus(201)
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
);
使用 Google 或 Facebook 登录时是否还需要令牌?因为他们已经使用了 Auth2.0 令牌?
对此没有明确的答案。这取决于”。例如,您可以使用 Facebook 或 Google 验证您的 /token
路由并从那里返回您自己的 JWT 令牌。
您可能想要检查以上所有内容的更详细的工作example implementation。
【讨论】:
以上是关于JWT:slim v3 和 Android 中的身份验证的主要内容,如果未能解决你的问题,请参考以下文章