Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php angular2与Slim framework jwt身份验证_Php_Angular_Authentication_Jwt_Slim - Fatal编程技术网

Php angular2与Slim framework jwt身份验证

Php angular2与Slim framework jwt身份验证,php,angular,authentication,jwt,slim,Php,Angular,Authentication,Jwt,Slim,我正在尝试创建一个survice来验证angular2中的用户名和密码。 这是authentication.service.ts的代码 import { Injectable } from '@angular/core'; import { Http, Headers, Response } from '@angular/http'; import { Observable } from 'rxjs'; import {Md5} from 'ts-md5/dist/md5

我正在尝试创建一个survice来验证angular2中的用户名和密码。 这是authentication.service.ts的代码

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; } } 从“@angular/core”导入{Injectable}; 从'@angular/Http'导入{Http,Headers,Response}; 从“rxjs”导入{Observable}; 从“ts-Md5/dist/Md5”导入{Md5}; 导出接口用户{ 用户名:字符串; 密码:string;} @可注射() 导出类身份验证服务{ 公共令牌:字符串; 构造函数(专用http:http){ //设置令牌(如果保存在本地存储中) var currentUser=JSON.parse(localStorage.getItem('currentUser'); this.token=currentUser&¤tUser.token; } 登录(用户:用户):可观察{ 返回此.http.post('http://localhost/hj1/api/authenticate', stringify({'user':user.userName,'password':Md5.hashStr(user.password)})) .map((响应:响应)=>{ //如果响应中有jwt令牌,则登录成功 控制台日志(响应); 让token=response.json()&&response.json().token; 如果(令牌){ //设置令牌属性 this.token=token; //将用户名和jwt令牌存储在本地存储中,以在页面刷新之间保持用户登录 setItem('currentUser',JSON.stringify({user:user,token:token})); //返回true表示成功登录 返回true; }否则{ //返回false表示登录失败 返回false; } } ); } 注销(){ localStorage.removietem(“当前用户”); this.token=null; } } 这是我使用slim框架的index.php

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() ; } } ?> getContainer(); $container[“jwt”]=函数($container){ 返回新的StdClass; }; $app->add(新建\Slim\Middleware\jwt身份验证)([ “路径”=>“/”, “通过”=>“/验证”, “秘密”=>getenv(“HJ_ENV”), “error”=>函数($request、$response、$arguments){ $data[“状态”]=“错误”; $data[“message”]=$arguments[“message”]; 返回$response ->withHeader(“内容类型”、“应用程序/json”) ->写入(json_encode($data,json_UNESCAPED_SLASHES | json_PRETTY_PRINT)); }, “回调”=>函数($request、$response、$arguments)使用($container){ $body=$response->getBody(); $body->write($arguments[“decoded”]); $container[“jwt”]=$arguments[“decoded”]; } ])); $app->post('/authenticate',authenticate'); $app->run(); 功能验证(请求$Request,响应$Response) { $params=json_decode($request->getBody()); $sql=“从用户名=:userName的用户中选择*”; $result=json_解码(runQuery($sql,[':userName',$params->user]); $body=$response->getBody(); 如果($result&&$result[0]->password==$params->password) { $decoded=$request->getAttribute(“jwt”); $body->write(json_编码(['token'=>$decoded]); } 其他的 { $body->write(json_编码(['token'=>null]); } } 函数runQuery($sql,…$params) { 尝试 { $db=getConnection(); $stmt=$db->prepare($sql); foreach($params作为$param) { $stmt->bindParam($param[0],$param[1]); } $stmt->execute(); $rows=[]; while($row=$stmt->fetch(PDO::fetch_OBJ)) { /*它将数据排成一行,并且是一个对象*/ 数组\u push($rows,$row); } $db=null; 返回json_encode($rows); } 捕获(PDO$e) { $db=null; 返回$e->getMessage(); } } ?> 我的问题是 我无法从容器['jwt']获取令牌。 若我给出了不正确的用户名和密码,那个么令牌将保持为空。 但如果我给出正确的用户名和密码。$result变量提供数据库中的数据。我可以验证密码。但是$request->getAttribute(“jwt”)这个方法给我空值。 我还检查了$decoded=$container[“jwt”] 但这也给了我零。 所以我不知道如何获得jwt创建的令牌。 多谢各位

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)); } }); 添加(新建\Slim\Middleware\jwt身份验证)([ “路径”=>“/”, “通过”=>“/验证”, “error”=>函数($request、$response、$arguments){ $data[“状态”]=“错误”; $data[“message”]=$arguments[“message”]; 返回$response ->withHeader(“内容类型”、“应用程序/json”) ->写入(json_encode($data,json_UNESCAPED_SLASHES) JSON_PRETTY_PRINT)); } ])); $app->post('/authenticate',函数(请求$Request,响应$Response) { $params=json_decode($request->getBody()); /*$params将包含angular为发布的用户和密码 数据库验证*/ /*在这里,您可以从数据库中检索用户名和密码*/ 如果(/*请在此处选中用户名和密码*/) { $now=新日期时间(); $future=新日期时间(“现在+2小时”); $payload=[ “iat”=>$now->getTimeStamp(), “exp”=>$future->getTimeStamp() ]; $secret=getenv(“HJ_ENV”);/*将您的密钥放在这里*/ $token=JWT::e