4

JSON を Android デバイスに返すために Slim フレームワークを使用しています。現在、デバイスでのログインに取り組んでいます。ログインには、Facebook、Google、アカウント ログインの 3 つの方法を使用しています。アカウント ログインを取得すると、新しいアカウントを登録するか、既存のアカウントでログインできます。

Web サービスのセキュリティのために、JWT セキュリティを使用することを考えました。だから私はそれがどのように機能するかについてのビデオを読んだり見たりしています。仕組みは理解していると思いますが、正しく実装する方法については何も見つかりません。

Slim v3 で使用するミドルウェアはSlim-JWT-Authです。これをスリムなフレームワークに実装するための次のリンクを見つけましたが、正しく動作すると思います。

今私の質問:

  1. トークンを生成するにはどうすればよいですか?
  2. いつトークンを生成しますか?
  3. Google または Facebook のサインインを使用する場合もトークンが必要ですか? 彼らはすでに Auth2.0 トークンを使用しているためですか?

それがどのように機能するかは理解していますが、いつ、どのように実装するかについては誰も話していません。では、いつトークンを生成する必要がありますか (Web サービスへのログイン時?)、アプリを起動するたびにトークンを生成する必要がありますか?それとも、トークンの有効期限が切れるまで待つ必要がありますか?

4

1 に答える 1

4

トークンを生成するにはどうすればよいですか?

ミドルウェアには既に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 トークンを使用しているためですか?

これに対する明確な答えはありません。場合によります"。たとえば/token、Facebook または Google でルートを認証し、そこから独自の JWT トークンを返すことができます。

上記のすべての詳細な実装例が進行中であり、確認する必要があります。

于 2016-03-05T09:34:45.887 に答える