오늘날에는 웹사이트에 로그인하는 것이 너무 쉬워졌습니다. WeChat에 로그인한 후 다른 웹사이트에 로그인하려면 QR 코드만 스캔하면 됩니다. 그런데 Java 사용법을 알고 계시나요? 스캔 QR 코드 인증을 구현하려면? 이 기사에서는 Java를 사용하여 코드 스캔 인증 로그인을 구현하는 방법에 대해 함께 알아 보겠습니다.
현재 두 개의 장치가 있다고 가정해 보겠습니다. 장치 A는 로그인을 승인하기 위해 QR 코드를 스캔해야 하고 장치 B는 이미 로그인된 장치입니다. 그런 다음 구현은 아래와 같습니다.
1: 장치 A가 QR 코드를 생성합니다.
장치 A는 서버에서 getLoginCode 인터페이스를 요청합니다. 이 인터페이스는 요청된 sessionId를 기반으로 base64 또는 기타 암호화 방법으로 암호화됩니다. 그런 다음 QR 코드의 값으로 사용하고 이 loginCode를 redis에 작성하고 5분 안에 만료되도록 설정합니다. 그런 다음 이 loginCode는 장치 A에 반환되고 장치 A는 이 값을 사용하여 로그인 QR 코드를 생성합니다.
둘: 기기 B가 인증을 위해 QR 코드를 스캔합니다
기기 B가 기기 A의 QR 코드를 스캔하면 QR 코드의 값을 전달하고 인증 로그인을 위해 scanConfirmLogin 인터페이스를 요청합니다. 이 인터페이스는 먼저 QR 코드가 있는지 확인합니다. 만료되지 않은 경우 후속 비즈니스 로직 처리가 수행되고 사용자의 기본 정보와 토큰이 Redis에 기록됩니다.
3: 장치 A는 승인 상태를 얻기 위해 폴링합니다.
장치 B는 인터페이스를 새로 고쳐서 1초에 한 번씩 사용자 승인 상태를 가져옵니다. 상태가 승인되면 후속 논리 처리를 위해 사용자 정보를 가져옵니다.
/** * 获取扫描登陆的二维码 * @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<String,Object> 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,String> map=new HashMap<>(); 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<String,String> map= JedisUtil.getMap(loginCode+"scanConfirmLogin"); if(map==null){ apiData(request, response,ReqJson.error(CommonError.AUTHORIZATION_HAS_EXPIRED)); return; } apiData(request, response, ReqJson.ok(map)); }
【추천 코스: Java 비디오 코스】
위 내용은 Java는 QR 코드 스캔 인증 로그인을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!