>  기사  >  Java  >  Java는 QR 코드 스캔 인증 로그인을 구현합니다.

Java는 QR 코드 스캔 인증 로그인을 구현합니다.

little bottle
little bottle앞으로
2019-04-09 14:03:084162검색

오늘날에는 웹사이트에 로그인하는 것이 너무 쉬워졌습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제