Oauth2授权模式访问之授权码模式(authorization_code)

SpringBoot OAuth2.0认证管理流程详解 OAuth2.0是一个开放的授权协议,可以用来实现第三方应用对我们API的访问控制,OAuth2.0中定义的角色包括: 1) Resource Owner(资源拥有者) 2) Client (第三方接入平台,请求者) 3) Resource Server (服务器资源: 数据中心) 4) Authorization Server (认证服务器) 授权认证的基本流程包括: 首先Client需要向Resource Ow...... 阅读详情

近期项目上需要将我司系统集成至合作方云平台,双方都有登录,于是改造我司登录模式(我司项目最终会部署至合作方服务器),通过oauth2接入合作方云平台实现获取授权码及token登录本身的项目,下面就实践过程进行记录整理

整体分为以下几个步骤

  1. 调用接口获取授权码
  2. 根据授权码获取accessToken
  3. 换取token、获取用户数据、创建ui参数、将ui参数与token绑定、构建首页地址、登录

下面就三个步骤进行解释:

1.调用接口授权码,oauth2的通用格式 xxx.com/oauth/authorize?client_id=client_id&response_type=code&redirect_uri=http://localhost:xxx/xxx

其中redirect_uri为回调接口,此次过程中为项目中接口,接收授权码回调并进行解析

  • 注:为了与前端解耦将获取授权码、获取token等操作都整合到了步骤3,通过一个回调接口进行登录操作,最后会附上代码进行解释

2.通过接口获取授权码 xxx.com/oauth/token?grant_type=authorization_code&client_id=client_id&client_secret=be4ba6c9-c6f9-bb81-f2df-88381208b8d6&code=8N6TIo&redirect_uri=http://localhost:8081/getloginIDaasCode

{
  "access_token": "436423b4-fc22-4f41-8186-d8706ae9396f",
  "token_type": "bearer",
  "refresh_token": "ce3dd10e-ec60-4399-9076-ee2140b04a61",
  "expires_in": 1999,
  "scope": "read write trust"
}

此时会获取到accessToken,此时已经完成调用,需要将合作方token改造换取成我方token

public OutputMessage loadAccessToken(HttpServletRequest request,HttpServletResponse response,
                            @RequestParam(name = "code")String authCode,
                            @RequestParam(name = "reqUrl",required=false)String reqUrl,
                            @RequestParam(required=false) String state) throws IOException, OAuthProblemException, OAuthSystemException {
   // code为授权码 如8N6TIo
   String homeUrl = publicService.genHomeUrl( authCode,reqUrl );
   WebUtils.issueRedirect(request, response, homeUrl);
   OutputMessage output = new OutputMessage();
   return output;
}

/**
	 *
	 * 1、换取token
	 * 2、获取用户数据
	 * 3、创建ui参数
	 * 4、将ui参数跟token数据进行绑定
	 * 5、构建首页地址
	 */
	@Override
	public String genHomeUrl(String authCode, String reqUrl) throws OAuthSystemException, OAuthProblemException {
        // 转发地址,clientId,秘钥等从数据库获取
		Oauth2Bean oauth2Bean = cuSysConfService.getOauth2Bean();
		//1、该代码块 从token中获取用户信息
		OAuthClientRequest req = OAuthClientRequest
				.tokenLocation(oauth2Bean.getTokenUrl())
				.setClientId(oauth2Bean.getClientId())
				.setClientSecret(oauth2Bean.getClientSecret())
				.setGrantType(GrantType.AUTHORIZATION_CODE).setCode(authCode)
				.setRedirectURI(StringUtils.isEmpty(reqUrl) ? oauth2Bean.getRedirectUrl() : reqUrl)
				.buildBodyMessage();
		req.addHeader("Accept", "application/json");
		req.addHeader("Content-Type", "application/json");

		OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        // 获取token
		OAuthAccessTokenResponse oauthResponse = oAuthClient.accessToken(req);
		String accessToken = oauthResponse.getAccessToken();

		//2、通过access_token获取userInfo
		OAuthClientRequest bearerClientRequest = new OAuthBearerClientRequest(oauth2Bean.getUserInfo()+"?client_id="+oauth2Bean.getClientId())
				.setAccessToken(accessToken)
				.buildQueryMessage();
		OAuthResourceResponse resourceResponse = oAuthClient.resource(bearerClientRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);
		String userName = resourceResponse.getBody();


		//3、构建UI参数  //"admin:#{"ct":"2022-05-06 11:05:10","reqUrl":"xxx"}#:code_admin";
		String uiTempl = "{}:#{\"ct\":\"{}\",\"reqUrl\":\"{}\"}#:{}"+CommonConstants.authCodeLink+"{}";
		String uiParam = StrUtil.format(uiTempl, userName, DateUtil.getNowDateTimeStr(),reqUrl, authCode,userName);
		CuSysConf UISecretKeyCuSysConf = cuSysConfService.findValidCuSysConfByConfKey(QuVars.sysLoginUIEncryptPubKey);
		if( UISecretKeyCuSysConf == null && UISecretKeyCuSysConf.getConfigValue()!=null ){
			throw new BusinessException("未找到秘钥信息,请联系管理员");
		}
		try {
			uiParam = RSAUtil.encrypt(uiParam, UISecretKeyCuSysConf.getConfigValue().trim() );
		} catch (Exception e) {
			LOG.error(e.getMessage(),e);
			throw new BusinessException( e.getMessage() );
		}
		//4、绑定ui参数
//		cacheDataService.saveAccessToken( authCode+ CommonConstants.authCodeLink+userName ,accessToken );
//		cacheDataService.saveAccessTokenInfo( authCode+CommonConstants.authCodeLink+userName, oauthResponse.getBody() );

		cuUsLoginSService.buildUserPermissionMenu(userName);

		String homeUrl = curesSService.findHomeUrl(userName);
		//5、构建首页地址,拼接首页地址进行转发,如前端参与可不做
		String url = "";
		//如果 reqUrl 不是空就使用此地址作为域名
		if( StrUtil.isNotBlank( reqUrl ) ){
			if (homeUrl.toLowerCase().startsWith("http")){
				homeUrl = homeUrl.toLowerCase()
						.replaceFirst("http://", "")
						.replaceFirst("https://", "");
			}
			String suffixUrl = "";
			if( homeUrl.contains("/") ){
				suffixUrl = homeUrl.substring(homeUrl.indexOf("/"));
			}
			if (reqUrl.toLowerCase().startsWith("http")) {
				url = reqUrl+suffixUrl;
			}else{
				url = "http://"+reqUrl+suffixUrl;
			}
			url = URLUtil.normalize(url);
			url = url+"?UI="+ URLEncoder.encode(uiParam);
		}else{
			url = homeUrl+"?UI="+ URLEncoder.encode(uiParam);
		}
		return url;
	}

最终将构建的地址进行访问即可直接通过token登录我司后台系统,达到接入oauth2系统无感登录。

OAuth 2.0中/oauth/authorize接口的核心作用解析 OAuth 2.0设计中使用**独立授权端点。 阅读详情

相关推荐

五分钟带你玩转oauth2(十四)重写源码,spring security+oauth2 实现token过期重定向原页面

楼主这里有个需求:当token过期后 重新获取token 并返回过期那页 这里主要依赖前端实现 xx.xx为前端 xx1.xx1为后端 1.当前端在 xx.xx/user token失效 2.原本获取http://192.168.xx1.xx1:6001/oauth/authorize?client_id=user-vue&response_type=code那么现在改成 http://192.168.xx1.xx1:6001/oauth/authorize?client_id=us..

小鲍侃java 3329

Spring Security Oauth2.0认证授权

认证: 用户认证就是判断一个用户的身份是否合法的过程 ,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。会话:用户认证通过后,为了避免用户的每次操作都进行认证可将用户的信息保证在会话中。会话就是系统为了保持当前用户的登录状态所提供的机制,常见的有基于session方式、基于token方式等。授权。

weixin_37536020的博客 6409

基于halcon的HSV颜色匹配实例

HSV颜色识别原图代码结果 原图 代码 dev_update_off () dev_close_window () *颜色数组 FuseColors := ['Orange','Red','Blue','Yellow','Green'] *画笔颜色数组 DisplayColors := ['coral','red','blue','goldenrod','forest green'] * HSV模型中H分量: Orange 10-30, Red 0-10,Blue 125-162,Yellow 3

qq_39467811的博客 3544

SpringSecurity OAuth2授权端点AuthorizationEndpoint、授权码AuthorizationCodeServices 详解

1、前言   在《授权服务器是如何实现授权的呢?》中,我们可以了解到服务端实现授权的流程,同时了解"/oauth/authorize"授权接口在AuthorizationEndpoint类中定义。这一节,我们将详细分析AuthorizationEndpoint类的实现。 2、AbstractEndpoint抽象类   AuthorizationEndpoint授权端点继承自AbstractEndpoint抽象类,这里我们先分析一下AbstractEndpoint抽象类的实现逻辑。   AbstractEnd

向心行者 9336

山景BP10_128DBG开发板ADC_Key驱动

最近在学习山景BP10_128DBG开发板,想使用开发板上的按键。看了看原理图和之前用过的按键好像有点不一样。常见的按键都是判断IO口是否被拉低或拉高来判断按键是否被按下。山景BP10_128DBG开发板上的按键是ADC按键,每个按键按下之后ADC的采样值是不同的,通过ADC采样回来的值进而判断哪个按键按下。这种方式核心思想就是用一个ADC通道来节约IO口,对于IO紧张的芯片是一个不错的解决思路。

weixin_56646002的博客 1311

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

Oauth2授权模式访问之授权码模式(authorization_code)访问

Oauth2授权模式访问之授权码模式(authorization_code)访问 获取code redirect_uri可以随便写,在浏览器输入(注意是get请求方式): http://localhost:8080/oauth/authorize?response_type=code&client_id=pair&redirect_uri=http://bai...

面朝大海,春暖花开 9万+

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

Oauth2.0 授权访问之 授权码模式(authorization_code)访问

第一步, 申请授权码 第二步, 请求连接,获取code http://localhost:8080/oauth/authorize? response_type=code &client_id=pair &redirect_uri=ht...

chiqiejie8745的博客 1558

Seedance2.5本地部署指南:从环境配置到生产优化的完整实践

在 AI 内容生成领域,本地部署方案正逐渐成为开发者和技术团队关注的焦点。Seedance2.5 作为一款支持图像和视频生成的 AI 工具,其完全离线运行的能力解决了云端服务在数据隐私、使用成本和访问稳定性方面的痛点。对于需要处理敏感内容、频繁生成素材或希望完全掌控生成流程的技术人员来说,掌握本地部署方法具有实际价值。 本文将以 Seedance2.5 的本地部署为例,详细介绍从环境准备、依赖配置到运行验证的完整流程,同时深入分析关键参数配置、常见问题排查方法以及生产环境下的优化建议。通过实际部署过程,理解

weixin_33139275的博客 732

C#操作MySQL从入门到精通(1)——安装MySQL数据库

我们使用C#操作MySQL数据库第一步要做的就是安装MySQL数据库,本文就是详细讲解如何安装MySQL数据库。

qq_34059233的博客 963

php oauth2.0密码模式,Oauth2.0 授权访问之 授权码模式(authorization_code)访问

第一步, 申请授权码第二步, 请求连接,获取codehttp://localhost:8080/oauth/authorize?response_type=code&client_id=pair&redirect_uri=http://baidu.com如果没有登录, 会首先重定向到登录页面 第三步,授权(authrization)确保用户是已经登陆的情况,在浏览器中输入和步骤1...

weixin_31784241的博客 701

Python爬虫实战:基于最新技术栈的晋江文学城小说爬取

本文将详细介绍如何使用Python最新技术栈构建一个高效的晋江文学城小说爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、分布式爬虫设计以及数据存储优化等高级话题。文章包含完整的代码实现,使用aiohttp+asyncio实现异步爬取,Playwright处理动态渲染,并结合Redis实现分布式任务队列。本文旨在为读者提供一个全面的现代Python爬虫开发指南。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。

2201_76125261的博客 872

IdentityServer4之Authorization Code(授权码)相对更安全

前言接着授权模式聊,这次说说Authorization Code(授权码)模式,熟悉的微博接入、微信接入、QQ接入都是这种方式(这里说的是oauth2.0的授权码模式),从用户体验上来看,...

dotNET跨平台 838

HX711重量传感器原理图设计,已量产(压力传感器)

最近调通了一款针对家用、物联网场景的重量传感套件,核心用了 HX711 这颗经典的称重 AD 芯片,还加了用户最需要的 “一键校准” 功能 —— 之前帮朋友做家用米桶余量报警时,用户总吐槽校准步骤太繁琐,这次的方案把操作简化到只按一个键,试下来体验好了不少。正好拆解下这套硬件的设计逻辑,供做同类产品的朋友参考。

不脱发的程序猿 369

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OAuth2.0授权码模式入门Demo

代码地址 代码是图灵学院的,我自己学完了之后把代码整理了一下,删掉了无用的代码,然后精简了一下 ​ https://gitee.com/zjj19941/ZJJ_Neaten5.10/tree/master/ZJJ_SpringCloud_Oauth2/demo01 代码 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-s

张俊杰 的博客 2242

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于spring-security-oauth2认证授权服务介绍与使用(二)

本文介绍了如何使用Spring Security OAuth2构建一个授权服务器,用户必要先得到oauth2-server的授权后得到access_Token,并使用这个access_token来从资源服务器获取数据。

若成风的博客 868

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

利用Spring Boot Oauth2 来熟悉oauth2 之 - Authorization Code Grant

参考文献 rfc 文档: RFC 6749 - The OAuth 2.0 Authorization Framework Spring boot oauth2 示例 Tutorial · Spring Boot and OAuth2 代码:https://github.com/choelea/tut-spring-boot-oauth2流程图从RFC文档复制过来的流程图, 来辅助我们理解oauth

云淡风轻 2万+

使用HttpClient获取oAuth2.0中的code、token及refreshToken

授权服务器使用授权码模式(authorization_code) 添加依赖 &amp;lt;!--对用户名和密码进行base64加密--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;commons-codec&amp;lt;/groupId&amp;gt; &amp;

小海子的博客 7212

OAuth2详解

是一种开放标准授权协议,可让第三方应用在用户许可的前提下,获得用户在某平台的资源(比如微博、微信、GitHub、企业微信等)。最常用于用户"用XX账号登录"第三方网站,以及内部微服务统一用户授权和认证。

onlymscn的博客 833

Oauth2

微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。OAuth 2.0定义了四种授权方式。OAUTH是一种开放的协议,为桌面、手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。

weixin_41057121的博客 128

Spring Cloud Security OAuth2(一)—— OAuth2协议简介

Spring Cloud Security OAuth2(一)—— OAuth2协议简介

Marvin Mai的博客 513

企业认证与安全体系(七):OAuth2 到底解决了什么问题?一篇讲透授权与第三方登录

OAuth2是一种授权框架,解决第三方应用在不获取用户密码的情况下安全访问用户资源的问题。核心思想是通过授权令牌而非密码,实现有限权限的资源访问。包含四个角色:资源拥有者、第三方应用、授权服务器和资源服务器。典型应用如微信登录,流程包括用户授权、获取临时code、后端换取token并建立系统自有登录态。OAuth2不是认证协议,而是授权协议,常与OpenID Connect配合实现登录功能。其价值在于权限可控、避免密码暴露、支持细粒度授权范围(scope),适用于第三方登录、开放平台授权和企业统一身份认证等

Mark Wu 的博客 550

OAuth2.0

oAuth认证是当下比较公认与应用较广泛的一种标准。使第三方应用可以安全的访问与操作其它应用程序。2.0相对于1.0来说,认证过程简化了许多,但不兼容1.0。2.0增加一个refreshToken的概念,每个返回的accessToken 都有一个有效期,过了有效期,需要refreshToken向服务器重新获得一个新的accessToken。Token相当于一个凭证一样,是该第三方应用访问其它应用的...

weixin_33775572的博客 122
上一篇: 排序算法学习-插入、希尔、归并
下一篇: Java根据自定义注解对接口权限控制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值