知识背景:
那年还是菜鸟,开始暗恋Java,像其他的菜鸟一样开始慢慢接触面向对象,硕士之前接触都是c、c++,其实对于面向对象的理解停留在认知阶段,后来自嘲没有女朋友,我可以new一个出来,现在有暗恋开始明恋,到然后喜欢上python,不过自从接触vert.x3和RXJava、netty后,又再次燃烧起我的欲望,最近接收需要为app提供微服务,对于无状态的,没有session、cookie,我们唯一能够提供的方式就是token,JSON Web Tokens(JWT).
JWT生成的token150个字符
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NTEzMDQ3OTgsImV4cCI6MTQ1MTMwNDg1OH0=.5kK9_8s1ZyGZ-6EBN1wF01Mzxw1g-WZQzYXSFC_C41Y=
我们通过这个token进行交换,来进行权限的验证,是否该用户能否访问我们的服务端数据。
http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html
我把token的放入我的redis中,存放时间为一分钟,然后加入refreshtoken存放10分钟,一般来说refreshtoken肯定比token时间要长,因为你还需要通过refreshtoken来获取token,refreshtoken是经过md5加密后,进行存放。
// this route is excluded from the auth handler
router.get("/api/newToken").handler(ctx -> {
ctx.response().putHeader("Content-Type", "text/plain");
String generateToken = jwt.generateToken(new JsonObject(), new JWTOptions().setExpiresInSeconds(1 * 60));
ctx.response().end(generateToken);
redisCacheService.put("token", generateToken, 1 * 60);
byte[] result = Base64.encodeBase64(generateToken.getBytes());
System.out.println(" refreshToken " + new String(result));
System.out.println(" token " + generateToken);
redisCacheService.put(new String(result), generateToken, 10 * 60);
});
router.get("/refreshToken").handler(ctx -> {
ctx.response().putHeader("Content-Type", "text/plain");
ctx.response().end(redisCacheService.get(""));
}
);
至于需要鉴权校验,需要使用到如下的包
<!-- spring-boot framework end-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-auth-jwt</artifactId>
<version>${vertx.version}</version>
</dependency>
Router router = Router.router(vertx);
router.route("/*").handler(SoloAuthProvider.create(vertx, redisCacheService));
router.route("/*").handler(req -> {
LOGGER.info("Any requests to URI starting '/' require login");
// No auth required
req.next();
});
// Create a JWT Auth Provider
JWTAuth jwt = JWTAuth.create(vertx, new JsonObject()
.put("keyStore", new JsonObject()
.put("type", "jceks")
.put("path", "keystore.jceks")
.put("password", "secret")));
至于vert.x3如何使用就不在这里过多叙述,在前面的文章已有聊过。
个人结论:
app的微服务校验这块完成后,接下来都是业务功能的开发,至于你是用spring、spring-boot以及mybatis还是其它的ORM不外乎就是增删改处理工作。
ps:有提供坐标杭州或者上海的公司的架构岗位,请随时联系本人,具体联系方式可以访问http://ibyoung.github.io