java实现二维码扫码授权登陆

网友投稿 327 2023-01-20


java实现二维码扫码授权登陆

假设现在有2个设备,A设备需要扫码授权登陆,B设备是已经登陆了的设备。然后实现如下:

一、A设备生成生成二维码:

A设备向服务器请求getLoginCode接口,这个接口根据请求的sessionId进行base64或其他加密方式进行加密,然后以此作为二维码的值,并将这个loginCode写到redis里,设置5分钟过期。然后将这个loginCode返回给A设备,A设备以此值来生成登陆的二维码。

二、B设备扫码授权

B设备来扫A设备的二维码的时候,携带二维码的值,请求授权登陆的接口scanConfirmLogin,此接口里先校验二维码是否过期,没过期的话进行后面的业务逻辑处理,将用户的基本信息和token写到redis里。

三、A设备轮询获取授权状态

B设备以每秒一次的频率来刷 获取用户授权状态接口,若状态为已授权,拿到用户信息去做后面的逻辑处理。

/**

* 获取扫描登陆的二维码

* @param noncestr随机字符串

* @throws Exception

*/

@RequestMapping(value = "user/getLoginCode.json")

public void getLoginCode(String noncestr,HttpServletRequest request,HttpServletResponse response) throws Exception {

if(StringUtil.isBlank(noncestr)){

apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));

return;

}

//参数的有效性校验在拦截器里实现

int expirationTime=300; //时效5分钟

final String sessionId=request.getSession().getId();

String loginCode=ToolUtils.getBase64(sessionId);

JedisUtil.set(loginCode, loginCode, expirationTime);

Map map=new HashMap<>();

map.put("loginCode", loginCode);

map.put("expirationTime", expirationTime);

apiData(request, response, ReqJson.ok(map));

}

/**

* 扫码确认登陆

* @param loginCode

* @param request

* @param response

* @throws Exception

*/

@RequestMapping(value = "user/scanConfirmLogin.json")

@AuthorizationApi

public void scanConfirmLogin(@CurrentToken final Token token,String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception {

if(StringUtil.isBlank(loginCode)){

apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));

return;

}

String userId=token.getUserId();

Map();

String loginTicket=JedisUtil.get(loginCode);

if(StringUtil.isBlank(loginTicket)){

//二维码过期

apiData(request, response,ReqJson.error(CommonError.TWO_DIMENSIONAL_CODE_HAS_EXPIRED));

return;

}

UserInfo userInfo = userInfoBiz.getUser(new UserInfo(userId));

if(userInfo==null){

apiData(request, response,ReqJson.error(UserError.USER_NOT_FOUND));

return;

}

//将用户信息放在缓存中

map.put(BaseConfig.ACCESS_TOKEN, token.getAccessToken());

map.put("userId", userInfo.getUserId());

map.put("rongCloudToken", userInfo.getRongCloudToken());

map.put("identity", userInfo.getIdentity());

JedisUtil.setMap(loginCode+"scanConfirmLogin", map, 300);

apiData(request, response, ReqJson.ok(new Object()));

}

/**

* 获取登陆状态

* @param loginCode

* @param request

* @param response

* @throws Exception

*/

@RequestMapping(value = "user/getScanConfirmLoginStatus.json")

public void getLoginStatus(final String loginCode,HttpServletRequest request,HttpServletResponse response) throws Exception {

if(StringUtil.isBlank(loginCode)){

apiData(request, response,ReqJson.error(CommonError.PARAMS_IMPERFECT));

return;

}

Map map= JedisUtil.getMap(loginCode+"scanConfirmLogin");

if(map==null){

apiData(request, response,ReqJson.error(CommonError.AUTHORIZATION_HAS_EXPIRED));

return;

}

apiData(request, response, ReqJson.ok(map));

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IDEA 开发多项目依赖的方法(图文)
下一篇:java实现装饰器模式(Decorator Pattern)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~