## `Token` 组件 Token 组件可以理解为 API 中使用的 Session,因为 API 是脱离 Cookie 的,Session 无法运行,所以 API 通常是在 GET/POST/HEADER 中带上一个 access_token 参数来保持会话状态,MixPHP 提供了 Token 来帮助用户在 API 中操作会话。 | 类 | 调用 | 运行环境 | | --- | --- | --- | | mix\web\Token | \Mix::app()->token | MixHttpd/Apache/PHP-FPM | >[danger] Token 组件暂时只支持 Redis,使用前需先安装 Redis 数据库。 ## 组件配置 App配置文件中,该组件的默认配置如下: ~~~ // Token 'token' => [ // 类路径 'class' => 'mix\web\Token', // 保存处理者 'saveHandler' => [ // 类路径 'class' => 'mix\client\Redis', // 主机 'host' => '127.0.0.1', // 端口 'port' => 6379, // 数据库 'database' => 0, // 密码 'password' => '', ], // 保存的Key前缀 'saveKeyPrefix' => 'MIXTKID:', // 有效期 'expires' => 604800, // token键名 'name' => 'access_token', ], ~~~ ## 使用场景 Token 通常有三种使用场景: - 通过 username、password 获取 access_token,用于授权给客户端,使用 access_token 可调用用户相关的接口。 - 通过 appid、appsecret、grant_type 获取 access_token,用于授权给第三方,使用 access_token 可调用平台内 grant_type 参数定义的相关权限的接口。 - OAuth 2.0:将自己平台内获取用户相关信息的权限授权给第三方。 >[info] Token 其实是使用 Redis 组件开发的组件,参考源代码可改造出 OAuth 2.0 Token。 ## 使用范例 第一种使用场景的范例代码。 获取Token控制器: ~~~ // 获取token方法 public function actionToken() { /* 验证账号密码成功后 */ // 保存会话信息 $userinfo = [ 'uid' => 1088, 'openid' => 'yZmFiZDc5MjIzZDMz', 'username' => '小明', ]; \Mix::app()->token->set('userinfo', $userinfo); // 设置唯一索引 \Mix::app()->token->setUniqueIndex($userinfo['openid']); // 响应 return [ 'errcode' => 0, 'access_token' => \Mix::app()->token->getTokenId(), 'expires_in' => \Mix::app()->token->expires, 'openid' => $userinfo['openid'], ]; } ~~~ 效验Token: 需创建一个 BaseController 控制器,然后其他控制器继承该控制器。 ~~~ // BaseController 的初始化事件 public function onInitialize() { parent::onInitialize(); // TODO: Change the autogenerated stub $userinfo = \Mix::app()->token->get('userinfo'); if (empty($userinfo)) { \Mix::app()->response->format = \mix\web\Response::FORMAT_JSON; \Mix::app()->response->content = ['errcode' => 300000, 'errmsg' => 'error']; \Mix::app()->response->send(); \Mix::app()->end(); } } ~~~ ## `setUniqueIndex` 方法 设置唯一索引,设置后会从上次设置的索引找出上次的tokenId,并删除上次的token数据,使上次的token失效,然后再将本次的tokenId存入索引。 ~~~ \Mix::app()->token->setUniqueIndex($openid); ~~~ ## `set` 方法 变量赋值。 ~~~ \Mix::app()->token->set('name', '小华'); ~~~ ## `get` 方法 获取变量的值。 >[info] name不存在时返回null。 ~~~ \Mix::app()->token->get('name'); ~~~ ## `has` 方法 判断变量是否存在。 ~~~ \Mix::app()->token->has('name'); ~~~ ## `delete` 方法 删除变量。 ~~~ \Mix::app()->token->delete('name'); ~~~ ## `clear` 方法 清空全部变量。 ~~~ \Mix::app()->token->clear(); ~~~ ## `getTokenId` 方法 获取TokenId。 ~~~ \Mix::app()->token->getTokenId(); ~~~