ホームページ  >  記事  >  Java  >  JavaはQRコードスキャン認証ログインを実装します

JavaはQRコードスキャン認証ログインを実装します

little bottle
little bottle転載
2019-04-09 14:03:084146ブラウズ

今日の生活では、Web サイトへのログインは非常に簡単になりました。WeChat にログインした後、別の Web サイトにログインしたいときは、QR コードをスキャンするだけです。しかし、その使い方は誰もが知っています。 Java で QR コードをスキャンします。許可されていますか?この記事では、Java を使用してコード スキャン認証ログインを実装する方法について説明します。一緒に学びましょう。

現在 2 つのデバイスがあるとします。デバイス A は QR コードをスキャンしてログインを承認する必要があり、デバイス B はすでにログインしているデバイスです。実装は以下のようになります:

1: デバイス A は QR コードを生成します:

デバイス A はサーバーから getLoginCode インターフェイスを要求します。このインターフェイスは次のベースで実行されます。 Base64 またはその他の暗号化方式で暗号化し、これを QR コードの値として使用し、この loginCode を Redis に書き込み、有効期限を 5 分に設定します。次に、このloginCodeがデバイスAに返され、デバイスAはこの値を使用してログインQRコードを生成します。

2: デバイス B は認証のために QR コードをスキャンします。

デバイス B がデバイス A の QR コードをスキャンすると、QR コードの値が伝達され、インターフェース scanconfirmLogin に認証ログインを要求します。このインターフェースでは、まず QR コードの有効期限が切れているかどうかを確認し、有効期限が切れていない場合は後続のビジネスロジック処理を実行し、ユーザーの基本情報とトークンを Redis に書き込みます。

3: デバイス A は、認証ステータスを取得するためにポーリングします。

デバイス B は、ユーザー認証ステータス インターフェイスを 1 秒に 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。