2017-01-04 13 views
0

angular2でユーザー名とパスワードを認証するためのサービスを作成しようとしています。ここ はauthentication.service.tsスリムフレームワークjwt認証を使用したangular2

 

    import { Injectable } from '@angular/core'; 
    import { Http, Headers, Response } from '@angular/http'; 
    import { Observable } from 'rxjs'; 
    import {Md5} from 'ts-md5/dist/md5'; 

    export interface User { 
     userName: string; 
     password: string; } 

    @Injectable() 
    export class AuthenticationService { 

     public token: string; 

     constructor(private http: Http) { 
      // set token if saved in local storage 
      var currentUser = JSON.parse(localStorage.getItem('currentUser')); 
      this.token = currentUser && currentUser.token; 
     } 

     login(user:User): Observable { 

      return this.http.post('http://localhost/hj1/api/authenticate', 
       JSON.stringify({ 'user': user.userName, 'password': Md5.hashStr(user.password) })) 
       .map((response: Response) => { 
        // login successful if there's a jwt token in the response 
        console.log(response); 
        let token = response.json() && response.json().token; 
        if (token) { 
         // set token property 
         this.token = token; 

         // store username and jwt token in local storage to keep user logged in between page refreshes 
         localStorage.setItem('currentUser', JSON.stringify({ user: user, token: token })); 

         // return true to indicate successful login 
         return true; 
        } else { 
         // return false to indicate failed login 
         return false; 
        } 
       } 
      ); 
     } 

     logout() { 
      localStorage.removeItem("currentUser"); 
      this.token = null; 
     } 
    } 

ためのコードであり、これは私の質問は、私はコンテナ[」からトークンを取得することはできませんよ でスリムなフレームワークに

 

    getContainer(); 

    $container["jwt"] = function ($container) { 
     return new StdClass; 
    }; 


    $app->add(new \Slim\Middleware\JwtAuthentication([ 
     "path" => "/", 
     "passthrough" => "/authenticate", 
     "secret" => getenv("HJ_ENV"), 
     "error" => function ($request, $response, $arguments) { 
      $data["status"] = "error"; 
      $data["message"] = $arguments["message"]; 
      return $response 
       ->withHeader("Content-Type", "application/json") 
       ->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); 
     }, 
     "callback" => function ($request, $response, $arguments) use ($container) { 
      $body = $response->getBody(); 
      $body->write($arguments["decoded"]); 
      $container["jwt"] = $arguments["decoded"]; 
     } 
    ])); 

    $app->post('/authenticate', 'authenticate'); 

    $app->run(); 

    function authenticate(Request $request, Response $response) 
    { 
     $params = json_decode($request->getBody()); 
     $sql = "select * from users where userName = :userName"; 
     $result = json_decode(runQuery($sql, [ ':userName', $params->user ])); 
     $body = $response->getBody(); 
     if ($result && $result[0]->password == $params->password) 
     { 
      $decoded = $request->getAttribute("jwt"); 
      $body->write(json_encode([ 'token' => $decoded ])); 
     } 
     else 
     { 
      $body->write(json_encode(['token' => null])); 
     } 
    } 

    function runQuery($sql, ...$params) 
    { 
     try 
     { 
      $db = getConnection(); 
      $stmt = $db->prepare($sql); 
      foreach ($params as $param) 
      { 
       $stmt->bindParam($param[0], $param[1]); 
      } 

      $stmt->execute(); 
      $rows = []; 
      while($row=$stmt->fetch(PDO::FETCH_OBJ)) 
      { 
       /*its getting data in line.And its an object*/ 
       array_push($rows, $row); 
      } 
      $db = null; 
      return json_encode($rows); 
     } 
     catch(PDOException $e) 
     { 
      $db = null; 
      return $e->getMessage() ; 
     } 
    } 

    ?> 

を使用して、私のindex.phpですjwt ']。 不正なユーザー名とパスワードを入力した場合、トークンはnullのままです。 しかし、私は正しいユーザー名とパスワードを教えてください。 $ result変数は自分のデータベースからデータを取得します。私はパスワードを確認することができます。 $ request-> getAttribute( "jwt")このメソッドはnullを返します。 また、$ decoded = $ container ["jwt"] をチェックしましたが、これも私にnullを与えます。 私はjwtによって作成されたトークンを取得する方法を知りませんでした。 ありがとうございます。

答えて

0
 

    add(new \Slim\Middleware\JwtAuthentication([ 
     "path" => "/", 
     "passthrough" => "/authenticate", 
     "error" => function ($request, $response, $arguments) { 
      $data["status"] = "error"; 
      $data["message"] = $arguments["message"] ; 
      return $response 
       ->withHeader("Content-Type", "application/json") 
       ->write(json_encode($data, JSON_UNESCAPED_SLASHES | 
        JSON_PRETTY_PRINT)); 
     } 
    ])); 

    $app->post('/authenticate', function (Request $request, Response $response) 
    { 
     $params = json_decode($request->getBody()); 
      /* $params will contain user and password posted by angular for 
       verification in data base */ 

      /* here you retrieve user name and password from database */ 
     if (/* check here user name and password */) 
     { 
      $now = new DateTime(); 
      $future = new DateTime("now +2 hours"); 
      $payload = [ 
       "iat" => $now->getTimeStamp(), 
       "exp" => $future->getTimeStamp() 
      ]; 
      $secret = getenv("HJ_ENV"); /* put your secret key here */ 
      $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)); 
     } 
     else 
     { 
      $data["status"] = "error"; 
      $data["message"] = "Invalid Token" ; 
      return $response 
       ->withHeader("Content-Type", "application/json") 
       ->write(json_encode($data, JSON_UNESCAPED_SLASHES | 
        JSON_PRETTY_PRINT)); 
     } 
    });