- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
1、背景 。
最近业务要求PC端系统登录使用APP应用扫码登录.
主要目的是:
1、简化用户录入账号密码,达到快速登录PC; 。
2、账号登录使用更加安全性; 。
3、为了推广更多让大家打开使用APP(因为行业的特殊性,实际业务场景中大都设计师都在使用PC端设计软件,同时也习惯了PC端下单).
。
2、处理流程 。
1、业务流程图 。
。
因为扫码的时候有两种处理逻辑,所以流程图有业务处理方案。但不管哪种方案,背后技术处理逻辑是一样的.
。
2、技术实现设计流图程 。
3、处理步骤说明 。
a、用户打开PC登录页面,PC登录页面向认证中心发起请求,认证中心生成uuid等信息,返回uuid等信息给前端,前端展示一个包含uuid的二维码.
b、PC端登录页面定时向认证中心轮询二维码的状态.
c、用户登录移动端,打开移动端摄像头扫描PC端登录页面的二维码.
d、移动端将二维码中包含的uuid等信息发送给认证中心,认证中心将二维码状态设置为“扫描成功”.
e、PC端登录页面轮询到二维码状态为“扫描成功”,提示“扫描成功”,以下图片仅供参考.
。
。
。
。
。
f、移动端展示消息确认弹出框,显示“登录”、“取消登录”按钮,同时将移动端当前登录的用账号、当前移动端登录的token和二维码uuid等信息发送给认证中心。 。
g、认证中心将用户所选要登录的账号保存在二维码信息里面,并将二维码状态设置为“已授权”.
h、登录页面从轮询二维码不存在时,提示“二维码已过期” ,以下图片仅供参考.
i、登录页面从轮询二维码状态为“已取销”时,提示“你已取消此次操作,你可再次扫描,或关闭窗口”.
j、登录页面从轮询二维码状态为“已授权”时,认证中心生成PC端登录的token,设置cookie,并向PC端前端发起重定向跳转.
。
程序处理时序图 。
。
3、代码实现 。
auth2认证最简单的代码结构示例 。
public class Auth2Login {
public static void main(String[] args) {
//Step 1: 获取授权请求URL
String authRequestUrl = "https://example.com/oauth/authorize";
//Step 2: 向授权服务器发送请求,获取授权码
String authCode = getAuthCode(authRequestUrl);
//Step 3: 使用授权码,向认证服务器发送请求,获取access token
String accessToken = getAccessToken(authCode);
//Step 4: 使用access token,访问资源服务器,进行用户登录
String userInfo = getUserInfo(accessToken);
//Step 5: 根据user info进行用户登录
login(userInfo);
}
public static String getAuthCode(String authRequestUrl) {
//TODO
return null;
}
public static String getAccessToken(String authCode) {
//TODO
return null;
}
public static String getUserInfo(String accessToken) {
//TODO
return null;
}
public static void login(String userInfo) {
//TODO
}
}
。
扫码登录认证关键代码片段 。
/**
* 初始化,主要通过请求基本参娄生成UUID,并把uuid写入redis
* @param cmd 请求参数
* @return
*/
public Response init(LoginQrCodeInitCmd cmd) {
String clientId = cmd.getClientId();
String clientRedirectUri = cmd.getClientRedirectUri();
ClientDetailsE clientDetails = oauthService.loadClientDetails(clientId);
if (clientDetails == null || clientDetails.getId() == null) {
return Response.buildFailure(AuthcenterCode.INVALID_CLIENT, String.format(AuthcenterCode.INVALID_CLIENT.getDesc(), clientId));
}
if (!clientDetails.getGrantTypes().contains(GrantType.QR_CODE.toString())) {
return Response.buildFailure(AuthcenterCode.INVALID_GRANT_TYPE, String.format(AuthcenterCode.INVALID_GRANT_TYPE.getDesc(), clientId));
}
LoginQrCodeE qrCodeE = LoginQrCodeE.instance().init(clientId, clientRedirectUri);
return DataResponse.of(BeanToolkit.instance().copy(qrCodeE, LoginQrCodeCO.class));
}
/**
* 通过UUID获取登录二维码
* @param uuid 唯一字符串
* @return QR code对象
*/
public LoginQrCodeE getLoginQrCode(String uuid) {
return LoginQrCodeE.instance().of(uuid);
}
/**
* 通过UUID扫码
* @param uuid 唯一字符串
* @return
*/
public Response scan(String uuid) {
LoginQrCodeE.instance().scan(uuid);
return Response.buildSuccess();
}
/**
* 取消登录确认
* @param uuid 唯一字符串
* @return
*/
public Response cancel(String uuid) {
LoginQrCodeE.instance().cancel(uuid);
return Response.buildSuccess();
}
/***
* 验证登录
* @param cmd 用户登录对象信息
* @return 如果成功返回登录信息结构体
*/
public Response authorize(LoginQrCodeAuthorizeCmd cmd) {
String uuid = cmd.getUuid();
String selectedAccountId = cmd.getSelectedAccountId();
String token = cmd.getToken();
//是否有扫码
if (LoginQrCodeE.instance().of(uuid).notScanned()) {
return Response.buildFailure(AuthcenterCode.QR_CODE_NOT_SCANNED);
}
/**
* 找出token
*/
AccessTokenE accessTokenE = oauthRepository.findAccessToken(token);
if (accessTokenE == null) {
return Response.buildFailure(AuthcenterCode.INVALID_TOKEN);
}
AccountE userAccount = oauthRepository.findAccountByToken(token);
if (userAccount == null) {
// 当前令牌不存在用户态(账号)
return Response.buildFailure(AuthcenterCode.TOKEN_ACCOUNT_RELA_NOT_EXIST);
}
List<String> userAccountIds = accountRepository.forceGetAccountIdsByMainUserId(userAccount.getMainUserId());
if (userAccountIds == null) {
// 当前账号异常
return Response.buildFailure(AuthcenterCode.UNKNOWN_ACCOUNT);
}
if (!userAccountIds.contains(selectedAccountId)) {
// 所选账号与当前令牌登录人信息不一致
return Response.buildFailure(AuthcenterCode.INVALID_SWITCH_ACCOUNT);
}
LoginQrCodeE.instance().authorize(uuid, selectedAccountId);
return Response.buildSuccess();
}
/**
* 对外提供轮旬时间服务方法,当查询redis key=uuid是否超时
* @param uuid 用户访问请求的UUID
* @return 登录码状态对象
* @throws OAuthSystemException
*/
public LoginQrCodeE handle(String uuid) throws OAuthSystemException {
LoginQrCodeE loginQrCode = getLoginQrCode(uuid);
// 当处于“已授权”状态时,才能触发准备登录
if (loginQrCode.authorized()) {
return loginQrCode.ready();
}
// 当处于“准备登录”状态时,才能触发登录
if (loginQrCode.loginReady()) {
return login(loginQrCode);
}
return loginQrCode;
}
/**
* 扫码登录
* @param loginQrCode 二维码带的对象信息
* @return
* @throws OAuthSystemException 认证异常
*/
public LoginQrCodeE login(LoginQrCodeE loginQrCode) throws OAuthSystemException {
String clientId = loginQrCode.getClientId();
String accountId = loginQrCode.getAccountId();
ClientDetailsE clientDetails = clientDetailsRepository.findByClientId(clientId);
AccountE userAccount = accountRepository.getAccountById(accountId);
accountRepository.checkAccount(userAccount);
AuthorizeE authorize = oauthRepository.findAccountAuthorizeByAccountId(accountId);
authorizeRepository.checkAuthorizeDataIntegrity(authorize);
if (authorize == null) {
throw new UnknownAuthorizeException("Cannot find AuthorizeE mainUserId="+mainUserId);
}
AccessTokenE accessToken = oauthService.retrieveQrCodeAccessToken(clientDetails, authorize, userAccount, new HashSet<>(),
new BizCodeE(loginQrCode.getAppCode(), loginQrCode.getSubAppCode()));
return loginQrCode.login(accessToken.getToken(), accessToken.getRefreshToken(), accessToken.getCastgt());
}
。
代码仅是展示关键的处理过程,结构还是比较清晰的;这里不提供完整的项目工程,因为这是公司的产权,况且每个公司的业务要求不同,大家理解后再去实现的自己扫码认证逻辑,处理方法大同小异.
。
最后此篇关于扫码登录认证技术原理介绍及实践的文章就讲到这里了,如果你想了解更多关于扫码登录认证技术原理介绍及实践的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 Tornado 与 twitter 等第三方进行身份验证。 我的登录处理程序看起来像这样 class AuthLoginHandler(BaseHandler, tornado.auth.
有没有一种真正的方法可以在 Pylons 中添加身份验证?我见过很多不同的方法,但大多数方法要么过时,要么过于复杂。是否有教程可以解释如何以良好而可靠的方式添加身份验证? 最佳答案 考虑使用 repo
RESTful 身份验证是什么意思,它是如何工作的?我在谷歌上找不到很好的概述。我唯一的理解是您在 URL 中传递了 session key (记住),但这可能是非常错误的。 最佳答案 如何在 RES
我正在考虑在基于插件的系统中实现安全性的多种方式。现在,当我说“安全”时,我的意思是: a) 插件系统的开发人员如何确保插件在核心平台上的使用是安全的。b) 插件开发人员如何确保在其平台上使用的插件是
我正在使用 WCF Webhttp 服务。我创建了一堆服务,剩下的就是放入用户身份验证... 问题 与其余架构风格保持一致,我是否应该针对用户 db 验证每个服务调用。 如果是这样,我应该在每次调用服
假设我想对 Mifare Classic 进行身份验证。 我如何知道要发送到卡的确切类型的 APDU? 例子。 这段代码: bcla = 0xFF; bins = 0x86; bp1 = 0x0;
我通过在文件 xyz.php 中编写以下代码登录到网站。当我运行这个文件时,我会登录到 moodle 网站。有什么方法可以像下面的登录代码一样注销吗? $user = authenticate_use
我有一个应用程序可以匿名访问除几个之外的所有 xpages。我需要强制用户登录这些 xpages。是使用 beforepageload 事件来检查用户登录页面并将其重定向到正确的方式还是有更好的方法?
我想用 ember.js 实现身份验证。 因此,当应用程序启动时,在路由器处理请求的 url 之前,我想检查用户状态。如果用户未通过身份验证,我想保存请求的 url 并重定向到特定的 url (/lo
您如何执行 jQuery Ajax 调用并在发送请求之前对调用进行身份验证? 我还没有登录所以必须进行身份验证。安全不是任何人都可以访问的问题,只需要进行身份验证。它只是基本的 http 身份验证,您
我尝试使用找到的 swift 代码 here在网站上找到here ,但响应是带有两个错误的 html 代码:“您必须输入密码!”和“您必须输入用户名!”我是 NSURLSession 的新手,并尝试更
我正在尝试连接到 Visa Direct API,但我没有通过基本的 SSL 证书认证,这是我的代码: import requests headers = { 'Content
我正在用 tornado 在 python 中开发一个 REST API,我将实现身份验证和授权,试图避免锁定到其他大项目,即 django。我也在通过论坛和 SO 环顾四周,我喜欢一个可能适合的解决
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
如何在 Android 中通过 HTTP 进行身份验证? 最佳答案 我非常难以在 Android 中通过 HTTP 进行身份验证,因为在浏览器(Web 和 Android native )中它工作完美
我有一些关于登录和 session 的问题。我有这段代码: 数据库查询: login: function(req,callback) { var query = 'SELECT id FROM
我开始使用 Swift 开发 iOS 应用。现在我正处于需要创建登录系统的部分。但是,我们需要人们提供的 LinkedIn 信息。 我如何在 iOS 中使用 OAuth2 API 来实现这一点? 我已
如果没有找到用户,问题出在每个 $routeChangeStart 上,如果我只输入 url,它仍然会引导我访问页面。 现在我已经在服务器上重写了规则。 Options +FollowSymlinks
简单代码 require 'net/http' url = URI.parse('get json/other data here [link]') req = Net::HTTP::Get.new(
参考文档: https://docs.sonarqube.org/latest/instance-administration/security/ 概述 SonarQube具有
我是一名优秀的程序员,十分优秀!