如何使用Hyperf框架进行JWT认证

来源:undefined 2024-12-16 04:47:45 1011

如何使用Hyperf框架进行JWT认证

引言:

Hyperf是一款基于Swoole的高性能协程框架,提供了丰富的功能和灵活的扩展性。JWT(JSON Web Token)是一种用于认证和传输信息的开放标准。在本文中,我们将介绍如何在Hyperf框架中使用JWT认证,并提供具体的代码示例。

一、安装依赖包

首先,我们需要安装hyperf/jwt和lcobucci/jwt依赖包。可以通过Composer进行安装,打开终端运行以下命令:

1

composer require hyperf/jwt lcobucci/jwt

登录后复制

二、配置认证信息

在Hyperf框架中,我们需要配置JWT认证所需的相关信息。打开config/autoload/jwt.php文件,添加如下配置项:

1

2

3

4

5

6

7

8

9

10

11

<?php return [

default => [

valid_seconds =&gt; env(JWT_VALID_SECONDS, 3600), // Token有效期

secret =&gt; env(JWT_SECRET, your-secret-key), // 对称加密密钥

refresh_ttl =&gt; env(JWT_REFRESH_TTL, 20160), // Token刷新有效期

password_key =&gt; env(JWT_PASSWORD_KEY, password), // 密码字段名称

blacklist_enabled =&gt; env(JWT_BLACKLIST_ENABLED, true), // Token黑名单启用

blacklist_grace_period =&gt; env(JWT_BLACKLIST_GRACE_PERIOD, 60), // Token宽限期

claim =&gt; [], // 自定义Claims

],

];

登录后复制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?php declare(strict_types=1);

namespace AppController;

use HyperfDiAnnotationInject;

use PsrHttpMessageResponseInterface;

class AuthController extends AbstractController

{

/**

* @Inject

* @var HyperfJwtJwt

*/

private $jwt;

public function login(): ResponseInterface

{

// 对用户进行验证,验证通过后生成Token

$userId = 1;

$token = $this->jwt-&gt;make([user_id =&gt; $userId]);

return $this-&gt;response-&gt;json([

token =&gt; $token-&gt;toString(),

expires_at =&gt; $token-&gt;getClaim(exp),

]);

}

}

登录后复制

接下来,我们需要在中间件中验证JWT Token并解析出用户信息。在中间件中引入HyperfJwtMiddlewareJwtMiddleware类,并使用handle()方法进行验证和解析。示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

<?php declare(strict_types=1);

namespace AppMiddleware;

use HyperfDiAnnotationInject;

use HyperfHttpServerContractRequestInterface;

use HyperfHttpServerContractResponseInterface as HttpResponse;

use HyperfUtilsContext;

use HyperfUtilsStr;

use HyperfJwtExceptionTokenValidException;

use HyperfJwtJwtInterface;

use PsrContainerContainerInterface;

class JwtMiddleware

{

/**

* @Inject

* @var HyperfJwtJwt

*/

private $jwt;

/**

* @var JwtInterface

*/

private $jwtFactory;

/**

* @var RequestInterface

*/

private $request;

/**

* @var HttpResponse

*/

private $response;

public function __construct(ContainerInterface $container, JwtInterface $jwt, RequestInterface $request, HttpResponse $response)

{

$this->jwtFactory = $jwt;

$this-&gt;request = $request;

$this-&gt;response = $response;

}

public function handle($request, Closure $next)

{

$token = Str::replaceFirst(Bearer , , $this-&gt;request-&gt;header(Authorization)); // 从Header中获取Token

if (empty($token)) {

throw new TokenValidException(Token not provided);

}

try {

$token = $this-&gt;jwtFactory-&gt;parse($token); // 解析Token

$claims = $token-&gt;claims(); // 获取Token中的声明

Context::set(user_id, $claims-&gt;get(user_id)); // 设置用户ID到上下文

} catch (TokenValidException $e) {

throw new TokenValidException(Invalid token, $e-&gt;getCode(), $e);

}

return $next($request);

}

}

登录后复制

四、使用中间件进行认证

在路由中使用中间件进行JWT认证。打开config/routes.php文件,添加如下路由和中间件配置项:

1

2

3

4

5

6

7

8

9

10

<?php use AppMiddlewareJwtMiddleware;

Router::addGroup(/api, function () {

Router::post(/login, AppControllerAuthController@login);

// 需要认证的路由

Router::addGroup(/auth, function () {

Router::get(/info, AppControllerAuthController@info);

}, [middleware => [JwtMiddleware::class]]);

});

登录后复制

在上面的示例中,AppControllerAuthController@info是需要进行认证的接口。只有在携带有效的JWT Token时,才能成功访问该接口。

结论:

本文介绍了如何使用Hyperf框架进行JWT认证,并提供了相关的配置和代码示例。通过JWT认证,我们可以在Hyperf框架中实现较高的安全性和用户验证功能。希望本文对你在使用Hyperf框架进行JWT认证有所帮助。

以上就是如何使用Hyperf框架进行JWT认证的详细内容,更多请关注php中文网其它相关文章!

最新文章