## `Auth` 组件  本组件用于 API 中的授权与会话,基于 JWT,使用 BearerToken 的方式传递,可独立使用。 ## 组件 使用 [composer]([https://www.phpcomposer.com/](https://www.phpcomposer.com/)) 安装: ~~~ composer require mix/auth ~~~ ## 依赖注入配置 - [beans/auth.php](https://github.com/mix-php/mix-skeleton/blob/master/beans/auth.php) JWT 支持的全部算法: - Mix\Auth\JWT::ALGORITHM_HS256 - Mix\Auth\JWT::ALGORITHM_HS384 - Mix\Auth\JWT::ALGORITHM_HS512 - Mix\Auth\JWT::ALGORITHM_RS256 - Mix\Auth\JWT::ALGORITHM_RS384 - Mix\Auth\JWT::ALGORITHM_RS512 HS 算法配置: ``` // JWT [ // 类路径 'class' => \Mix\Auth\JWT::class, // 属性注入 'properties' => [ // 钥匙 'key' => 'example_key', // 签名算法 'algorithm' => Mix\Auth\JWT::ALGORITHM_HS256, ], ], ``` RS 算法配置: ``` // JWT [ // 类路径 'class' => \Mix\Auth\JWT::class, // 属性注入 'properties' => [ // 私钥 'privateKey' => '', // 公钥 'publicKey' => '', // 签名算法 'algorithm' => \Mix\Auth\JWT::ALGORITHM_RS256, ], ], ``` ## 使用范例 - 获取 access_token 的接口: ``` /** * 授权方法 * @return Response */ public function auth(ServerRequest $request, Response $response) { /* 验证账号密码成功后 */ // 创建Token $time = time(); /** @var Authorization $auth */ $auth = context()->get('auth'); $payload = [ "iss" => "http://example.org", // 签发人 'iat' => $time, // 签发时间 'exp' => $time + 7200, // 过期时间 'uid' => 100008, ]; $accessToken = $auth->createToken($payload); // 响应 $data = [ 'status' => 0, 'data' => [ 'access_token' => $accessToken, 'expire_in' => 7200, ], ]; return ResponseHelper::json($response, $data); } ``` - 效验Token (在中间件中校验): [>> AuthMiddleware::class 源码 <<](https://github.com/mix-php/mix-skeleton/blob/master/app/Http/Middleware/AuthMiddleware.php) >[danger] 每调用一次 getPayload 就会解码一次,所以解码后的用户信息需要保存起来,不要在获取用户信息时每次都去解码, AuthMiddleware::class 把 JWT Payload 放入了 Request 中,其他位置调用时就不需要解码了。 - BearerToken 传值范例: ![](https://i.loli.net/2019/06/10/5cfdfde331f4921098.png)