# 自定义校验token

在`@Open`注解中有一个属性`needToken`，用来告诉网关是否校验token

```java
/**
* 是否需要appAuthToken，设置为true，网关端会校验token是否存在
*/
boolean needToken() default false;
```

使用方式：

```java
@ApiOperation(value="传递token", notes = "传递token")
@Open(value = "story.get.token", needToken = true/* 设置true，网关会校验token是否存在 */)
@RequestMapping("token")
public StoryResult token(StoryParam story, HttpServletRequest request) {
    OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
    StoryResult result = new StoryResult();
    result.setName("appAuthToken:" + openContext.getAppAuthToken());
    return result;
}
```

指定了needToken=true后，网关会判断客户端是否传了`app_auth_token`参数，没有传则返回错误信息。

网关默认简单校验参数值是否存在，如果要校验有效性，需要自己实现。

自己实现步骤：

- 设置`ApiConfig中的tokenValidator属性`

`TokenValidator`是一个函数式接口，可以直接使用Lambda表达式，示例代码如下：

```java
@Component
public class MyConfig {

    @PostConstruct
    public void after() {
        ApiConfig.getInstance().setTokenValidator(apiParam -> {
            // 获取客户端传递过来的token
            String token = apiParam.fetchAccessToken();
            return !StringUtils.isBlank(token);
            // TODO: 校验token有效性，可以从redis中读取
            
            // 返回true表示这个token真实、有效
        });
    }
}
```
