Commit 3e37cfef by giaogiao

增加接口:根据客户方生成签名字符串 验证通过则下发token

parent 90b07d5d
......@@ -11,15 +11,11 @@ import java.util.Date;
/**
* 客户方签名字符串生成 单元测试
*/
//@RunWith(SpringJUnit4ClassRunner.class)
//@SpringBootTest
public class SignTest {
// @Autowired
// private ImClientService imClientService;
/**
* 获取sign,客户端sdk得到sign之后就可以进行登录 和开启websocket
* 获取sign,客户端sdk得到sign之后就可以进行登录,websocket连接初始化需要带上sign,验证通过才能连接成功
* <p>
* sign = MD5{ clientId + appKey + appSecret}
*
......
......@@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
*
* Hello World Controller
**/
@Slf4j
......
......@@ -33,10 +33,10 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/imMessage")
@Api(value = "消息存储表API", tags = {"消息存储表"})
public class ImMessageController extends BaseController {
public class ImMessageController extends BaseController {
@Autowired
private ImMessageService imMessageService;
@Autowired
private ImMessageService imMessageService;
/**
* 添加消息存储表
......@@ -44,8 +44,8 @@ private ImMessageService imMessageService;
@PostMapping("/add")
@OperationLog(name = "添加消息存储表", type = OperationLogType.ADD)
@ApiOperation(value = "添加消息存储表")
public ApiResult<Boolean> addImMessage(@Validated(Add.class) @RequestBody ImMessage imMessage)throws Exception{
boolean flag= imMessageService.saveImMessage(imMessage);
public ApiResult<Boolean> addImMessage(@Validated(Add.class) @RequestBody ImMessage imMessage) throws Exception {
boolean flag = imMessageService.saveImMessage(imMessage);
return ApiResult.result(flag);
}
......@@ -55,8 +55,8 @@ private ImMessageService imMessageService;
@PostMapping("/update")
@OperationLog(name = "修改消息存储表", type = OperationLogType.UPDATE)
@ApiOperation(value = "修改消息存储表")
public ApiResult<Boolean> updateImMessage(@Validated(Update.class) @RequestBody ImMessage imMessage)throws Exception{
boolean flag= imMessageService.updateImMessage(imMessage);
public ApiResult<Boolean> updateImMessage(@Validated(Update.class) @RequestBody ImMessage imMessage) throws Exception {
boolean flag = imMessageService.updateImMessage(imMessage);
return ApiResult.result(flag);
}
......@@ -66,8 +66,8 @@ private ImMessageService imMessageService;
@PostMapping("/delete/{id}")
@OperationLog(name = "删除消息存储表", type = OperationLogType.DELETE)
@ApiOperation(value = "删除消息存储表")
public ApiResult<Boolean> deleteImMessage(@PathVariable("id") Long id)throws Exception{
boolean flag= imMessageService.deleteImMessage(id);
public ApiResult<Boolean> deleteImMessage(@PathVariable("id") Long id) throws Exception {
boolean flag = imMessageService.deleteImMessage(id);
return ApiResult.result(flag);
}
......@@ -77,7 +77,7 @@ private ImMessageService imMessageService;
@GetMapping("/info/{id}")
@OperationLog(name = "消息存储表详情", type = OperationLogType.INFO)
@ApiOperation(value = "消息存储表详情")
public ApiResult<ImMessageQueryVo> getImMessage(@PathVariable("id") Long id)throws Exception{
public ApiResult<ImMessageQueryVo> getImMessage(@PathVariable("id") Long id) throws Exception {
ImMessageQueryVo imMessageQueryVo = imMessageService.getImMessageById(id);
return ApiResult.ok(imMessageQueryVo);
}
......@@ -88,10 +88,10 @@ private ImMessageService imMessageService;
@PostMapping("/getPageList")
@OperationLog(name = "消息存储表分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "消息存储表分页列表")
public ApiResult<Paging<ImMessageQueryVo>>getImMessagePageList(@Validated @RequestBody ImMessagePageParam imMessagePageParam)throws Exception{
public ApiResult<Paging<ImMessageQueryVo>> getImMessagePageList(@Validated @RequestBody ImMessagePageParam imMessagePageParam) throws Exception {
Paging<ImMessageQueryVo> paging = imMessageService.getImMessagePageList(imMessagePageParam);
return ApiResult.ok(paging);
}
}
}
package com.wecloud.im.controller;
import com.wecloud.im.param.ImTokenVerify;
import com.wecloud.im.service.ImClientLoginService;
import com.wecloud.im.vo.TokenVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* token 控制器
*
* @author wei
* @since 2021-04-27
*/
@Slf4j
@RestController
@RequestMapping("/token")
@Api(value = "token API", tags = {"token相关"})
public class TokenController extends BaseController {
@Autowired
private ImClientLoginService imClientLoginService;
/**
* 根据客户方生成签名字符串 验证通过则下发token
*/
@PostMapping("/verify")
@ApiOperation(value = "验证sign,并返回token", notes = "根据客户方生成签名字符串 验证通过则下发token")
public ApiResult<TokenVo> verify(@RequestBody ImTokenVerify imTokenVerify) throws Exception {
return imClientLoginService.verifySign(imTokenVerify);
}
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 消息存储表
*
* @author wei
* @since 2021-04-29
*/
@Data
@ApiModel(value = "ImTokenVerify")
public class ImTokenVerify {
private static final long serialVersionUID = 1L;
@ApiModelProperty("时间戳")
private String timestemp;
@ApiModelProperty("client客户端id")
private String clientId;
@ApiModelProperty("appkey")
private String appKey;
@ApiModelProperty("签名sign")
private String sign;
}
package com.wecloud.im.service;
import com.wecloud.im.param.ImTokenVerify;
import com.wecloud.im.vo.TokenVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
/**
* 终端表 服务类
*
* @author wei
* @since 2021-04-27
*/
public interface ImClientLoginService {
/**
* 根据客户方生成签名字符串 验证通过则下发token
*
* @param imTokenVerify
* @return
*/
ApiResult<TokenVo> verifySign(ImTokenVerify imTokenVerify);
}
package com.wecloud.im.service.impl;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.param.ImTokenVerify;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientLoginService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.tillo.app_ws.utils.RedisUtils;
import com.wecloud.im.vo.TokenVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.time.Duration;
@Service
@Slf4j
public class ImClientLoginServiceImpl implements ImClientLoginService {
@Autowired
private RedisUtils redisUtils;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImClientService imClientService;
/**
* 根据客户方生成签名字符串 验证通过则下发token
*
* @param imTokenVerify
* @return
*/
@Override
public ApiResult<TokenVo> verifySign(ImTokenVerify imTokenVerify) {
// 根据appKey从数据库查询密钥
ImApplication imApplication = imApplicationService.getOne(
new QueryWrapper<ImApplication>().lambda().eq(ImApplication::getAppKey, imTokenVerify.getAppKey())
);
// 生成以数据库为准的签名
String mySign = new MD5().digestHex(imTokenVerify.getTimestemp() + imTokenVerify.getClientId() + imApplication.getAppKey() + imApplication.getAppSecret());
// 验证签名
if (mySign.equals(imTokenVerify.getSign())) {
log.debug("sign一致" + mySign);
} else {
log.debug("sign不一致" + mySign);
return ApiResult.result(ApiCode.FAIL, null);
}
// 判断client是否存在
ImClient client = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, imTokenVerify.getClientId()));
if (client == null) {
log.debug("client不存在,先走注册流程");
ImClient imClient = new ImClient();
imClient.setId(new Snowflake(1L, 1L).nextId());
imClient.setFkAppid(imApplication.getId());
imClient.setClientId(imTokenVerify.getClientId());
imClientService.save(imClient);
}
// 生成token
String generateToken = JwtUtil.generateToken(imTokenVerify.getClientId(), imTokenVerify.getAppKey(), imApplication.getAppSecret(), Duration.ofDays(100));
// 保存redis
redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + imTokenVerify.getClientId(), generateToken);
TokenVo tokenVo = new TokenVo();
return ApiResult.ok(tokenVo);
}
}
package com.wecloud.im.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class TokenVo implements Serializable {
String token;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment