Maison  >  Article  >  Java  >  Java implémente la connexion d'autorisation de numérisation de code QR

Java implémente la connexion d'autorisation de numérisation de code QR

little bottle
little bottleavant
2019-04-09 14:03:084165parcourir

Dans la vie d'aujourd'hui, se connecter à un site Web est devenu si simple. Lorsque vous êtes connecté à WeChat, lorsque vous souhaitez vous connecter à un autre site Web, il vous suffit de scanner le code QR. Mais tout le monde sait comment l'utiliser. Java pour scanner le code QR Autorisé ? Cet article explique comment utiliser Java pour implémenter la connexion avec autorisation d'analyse de code. Apprenons-le ensemble.

Supposons qu'il y ait maintenant deux appareils. L'appareil A doit scanner le code QR pour autoriser la connexion, et l'appareil B est l'appareil qui a déjà été connecté. Ensuite, l'implémentation est la suivante,

1 : L'appareil A génère un code QR :

L'appareil A demande l'interface getLoginCode au serveur, et cette interface est exécutée en fonction du sessionId demandé, chiffrez avec base64 ou d'autres méthodes de chiffrement, puis utilisez-le comme valeur du code QR, écrivez ce loginCode dans redis et définissez une expiration de 5 minutes. Ensuite, ce loginCode est renvoyé au périphérique A, et le périphérique A utilise cette valeur pour générer un code QR de connexion.

Deux : l'appareil B scanne le code QR pour l'autorisation

Lorsque l'appareil B scanne le code QR de l'appareil A, il porte la valeur du code QR et demande l'interface de connexion d'autorisation scanConfirmLogin In. cette interface, vérifiez d'abord si le code QR a expiré. S'il n'a pas expiré, effectuez le traitement ultérieur de la logique métier et écrivez les informations de base et le jeton de l'utilisateur dans Redis.

Trois : l'appareil A interroge pour obtenir l'état d'autorisation

L'appareil B actualise l'interface d'état d'autorisation de l'utilisateur une fois par seconde. Si l'état est autorisé, il obtiendra les informations utilisateur et effectuera la logique suivante. traitement.

		/**
	 * 获取扫描登陆的二维码
	 * @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));
	}	

[Cours recommandé : Cours vidéo Java]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer