当前位置: 首页 > 知识库问答 >
问题:

具有Slim framework jwt身份验证的angular2

钮博裕
2023-03-14

我正在尝试创建一个服务来验证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;
        }
    }

这是我使用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() ; 
        }
    }

    ?>

我的问题是我无法从容器['jwt']获取令牌。如果我给出了不正确的用户名和密码,那么令牌将保持为NULL。但如果我给出正确的用户名和密码。$result变量为我提供数据库中的数据。我可以验证密码。但是$request->getAttribute(“jwt”)这个方法给了我null。此外,我还检查了$decoded=$container[“jwt”],但这也给了我null。所以我不知道如何获得jwt创建的令牌。谢谢你。

共有1个答案

冯哲彦
2023-03-14

    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));
        }
    });

 类似资料:
  • 问题内容: 我一直在玩漂亮的汤和解析网页几天。在编写的所有脚本中,我一直使用一行代码作为救星。代码行是: 但是… 我想对(OPEN A URL WITH AUTHENTICATION)做同样的事情: 我无法打开网址并阅读需要身份验证的网页。我如何实现这样的目标: 问题答案: 看看官方文档中的如何使用urllib软件包获取Internet资源:

  • 问题内容: 我必须 使用 HTTP Basic身份验证从http服务器下载和解析XML文件。现在,我这样做: 但是以这种方式,我无法从具有http身份验证的服务器获取xml(或者我只是根本不知道该文档)文档。 如果您能向我展示实现我的目标的最好,最简单的方法,我将不胜感激。 问题答案: 您可以使用。例如: 这将设置默认值,并将在 所有 请求中使用。显然,当您不需要所有请求的凭据或多个不同的凭据(可

  • 问题内容: 我试图通过将数据提取到网页中来使用Beanstalk(beanstalkapp.com)API,以便人们可以查看它而无需访问我的SVN。 我正在尝试访问它的方法是通过jQuery使用AJAX请求。代码在下面,但是每次都会出现错误,并且无法返回数据。 如果我直接通过浏览器(http://username.beanstalkapp.com/api/changesets.json)访问该UR

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 问题内容: 使用HttpUrlConnection使用抢占式基本HTTP身份验证的最佳方法是什么。(假设现在我不能使用HttpClient)。 编辑以澄清问题:我使用Base64编码在请求标头中正确设置了un / pw。是否需要设置任何其他标志或属性,或者我是否在为请求的基本身份验证头设置抢先式基本身份验证所需的全部信息? 问题答案: 如果您使用的是Java 8或更高版本,则可以使用: 然后正常使

  • 问题内容: 我有一条路由,需要经过身份验证和未经身份验证的用户使用。我用来启用身份验证,但是它可以防止任何未经身份验证的用户访问路由(正常)。 如何允许未经身份验证的用户也访问路由? 似乎没有可以传递给我的护照策略中的选项。 问题答案: 您可以通过扩展现有实例来创建自己的实例: 然后在您的控制器上使用此代码: