OAuth2.0客户端基于oltu搭建

news2024/12/30 2:50:45

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu

oltu介绍

Apache Oltu 是一个开源的 OAuth 库,用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议,常用于保护和控制对 Web 资源的访问。Oltu 项目最初由 Apache 基金会发起,目的是提供一个易于使用的 Java 库,帮助开发者构建 OAuth 认证和授权的功能。简单来讲它能够帮助我们更快捷的实现OAuth协议

oltu既能够实现客户端又能够实现服务端,本次我们只需要构建客户端即可

依赖

        <dependency>
            <groupId>org.apache.oltu.oauth2</groupId>
            <artifactId>org.apache.oltu.oauth2.client</artifactId>
            <version>1.0.2</version>
        </dependency>

测试代码

oltu说起来其实也不复杂,他内部封装了一个httpclient,简单来说我们完全可以通过httpclient来实现OAuth2.0客户端,不过oltu已经帮我们将该有的调用格式都封装好了,此处测试使用了url重定向,这么做是为了方便测试,需要将其加入到拦截其中

/**
 * 获取授权的控制器
 */
@Controller
@RequestMapping("/client")
@Slf4j
public class GetAuthorizationController {
 
    private static String CLIENT_ID = "20210903";
    private static String CLIENT_SECRET = "cas123456";
    private static String CODE_URL = "oauth2.0/authorize";
    private static String RESPONSE_TYPE = "code";
    /*认证服务器地址*/
    private static String AUTH_SERVER_URL = "https://cas.test.com:8443/cas/oauth2.0/accessToken";
    /*资源拥有者地址*/
    private static String RESOURCE_OWNER_URL = "https://cas.test.com:8443/cas/";
    /*资源服务器地址*/
    private static String RESOURCE_SERVER_URL = "https://cas.test.com:8443/cas/oauth2.0/profile";
    /*授权码回调地址*/
    private static String CALLBACKCODE = "https://localhost:8082/client/callbackCode";
    /*获取资源地址*/
    private static String GETRESOURCE = "https://localhost:8082/client/getResource";
 
    /**
     * 客户向资源所有者获取授权码
     */
    @GetMapping("/getCode")
    public String getCode() throws OAuthSystemException {
        OAuthClientRequest oAuthClientRequest = OAuthClientRequest
                .authorizationLocation(CODE_URL)
                .setClientId(CLIENT_ID)
                .setResponseType(RESPONSE_TYPE)
                .setRedirectURI(CALLBACKCODE)
                .buildQueryMessage();
        String uriString = oAuthClientRequest.getLocationUri();
        //重定向到资源所有者,获取验证码
        return "redirect:" + RESOURCE_OWNER_URL + uriString;
    }
 
    /**
     * 1. 资源所有者在生成授权码之后,会回调该接口将授权码传回给客户
     * 2. 客户获取授权码之后,使用该接口向认证服务器申请令牌
     */
    @GetMapping("/callbackCode")
    public String callbackCode(HttpServletRequest request) throws OAuthSystemException, OAuthProblemException {
        String code = request.getParameter("code");
        log.info(" --- 从资源拥有者获取code: {} -----------", code);
        //code需要非对称加密
        OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        OAuthClientRequest tokenRequest = OAuthClientRequest
                .tokenLocation(AUTH_SERVER_URL)
                .setClientId(CLIENT_ID)
                .setClientSecret(CLIENT_SECRET)
                .setGrantType(GrantType.AUTHORIZATION_CODE)
                .setCode(code)
                .setRedirectURI(GETRESOURCE)
                .buildQueryMessage();
        //通过Code,向认证服务器申请令牌
        OAuthResourceResponse resourceResponse = oAuthClient.resource(tokenRequest, OAuth.HttpMethod.GET,OAuthResourceResponse.class);
        String accessToken = resourceResponse.getBody();
        //获取令牌
        log.info("客户获取的访问令牌:" + accessToken);
        return "redirect:" + GETRESOURCE + "?" + accessToken;
    }
 
    /**
     * 使用令牌获取资源服务器中的数据
     */
    @GetMapping("/getResource")
    @ResponseBody
    public String getResource(String access_token) throws OAuthSystemException, OAuthProblemException {
        log.info("客户使用令牌向资源服务器获取数据 token = " + access_token);
        OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
        OAuthClientRequest userInfoRequest =
                new OAuthBearerClientRequest(RESOURCE_SERVER_URL)
                        .setAccessToken(access_token)
                        .buildQueryMessage();
        OAuthResourceResponse resourceResponse = oAuthClient.resource(userInfoRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);
        String userInfo = resourceResponse.getBody();
        log.info("客户获取的资源服务器的数据: " + userInfo);
        return userInfo;
    }
 
}

测试

首先请求https://localhost:8082/client/getCode

 此时我们并没有登录,所以会跳转到我们之前文章中CAS的登录页面

 输入用户名密码后,会进行两次重定向,最终返回所有的用户信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久&#xff0c;Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送&#xff0c;Midjourney 会根据该图像生成四种可…

图片无损放大在线工具分享

在论文写作过程中 忘了将图片保存330dpi怎么办&#xff1f;截图的图片放论文&#xff0c;十分模糊怎么办&#xff1f; 图片模糊、不清晰转高清的神器 【传送门】 推荐理由:无广告、速度快、在线版&#xff0c;随时用。

数据结构之【泛型】

泛型&#xff1a;定义阶段不明确具体类型&#xff0c;产生对象时明确具体类型。 //Object是Java中的最高参数统一化&#xff0c;能够接受所有的引用类型&#xff1b; //有了包装类的自动拆装箱之后&#xff0c;Object还能够接收基本类型数值&#xff08;自动装箱&#xff09; …

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有&#xff1a;配送员微信小程序端的主要功能有&#xff1a;商家微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&am…

单调栈和单调队列可以很简单

大家好&#xff0c;我是 方圆。我觉得单调栈和单调队列的题目很有特点&#xff0c;而且理解了它的特点能够很轻松容易地解决一系列题目&#xff0c;所以决定用这篇帖子记录一下&#xff0c;也想以此来帮助在刷同样类型题目的朋友们。如果大家想要找刷题路线的话&#xff0c;可以…

每日一题~组合总数III

原题链接&#xff1a;216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 这是一个组合的问题&#xff0c;所以我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方式将所有的情况都列举出来&#xff0c;然后将其中…

企业怎么申请OV SSL证书?

随着互联网的发展&#xff0c;越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书&#xff0c;能够重点强调网站安全、企业可信形象的网站&#xff0c;保密传输更加安全。那么&#xff0c;企业怎么申请OV SSL证书呢&#xff1f;接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构&#xff0c;它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层&#xff0c;并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块&#xff0c;这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. PCB初认…

Java基本数据类型只有八种?第九种告诉你

一、前言 今天看了一下Oracle官网的JVM规范&#xff0c;发现基本数据不止有八种。 这个东西一直都是说着八种&#xff0c;官网把returnAddress放在八种基本数据类型一起说的&#xff0c;我们可以理解为第九种&#xff01; 常说的八种用于存储常见的数值和字符数据&#xff0…

计算机等级考试—信息安全三级真题六

目录 一、单选题 二、填空题 三、综合题 一、单选题

阿里云ESS弹性伸缩核心概念与基本使用

文章目录 1.ESS弹性伸缩基本概念1.1.弹性伸缩概念1.2.弹性伸缩应用场景1.3.弹性伸缩的应用模式 2.开通ESS弹性伸缩服务3.为KodCloud云盘集群创建弹性伸缩组3.1.创建伸缩组3.2.设置伸缩组的名称、类型、移除策略、健康检查3.3.设置组内实例数、冷却时间、网络类型、扩缩容策略、…

python循环判断

运算符短路逻辑python优先级 思维导图for循环 运算符 运算符含义and左边和右边同时为True,结果为Trueor左右两边其中一个为True,结果为Truenot如果操作数为True(False)&#xff0c;结果为False(True) 短路逻辑 从左到右&#xff0c;只有当第一操作数的值无法确定逻辑运算的结…

电脑开机慢怎么办?这样解决快速且有效!

“明明电脑用了才没多久&#xff0c;为什么开机那么慢呀&#xff1f;经常开个机需要好几分钟&#xff0c;这很耽误我的工作&#xff0c;请问有什么方法可以解决这个问题吗&#xff1f;” 电脑是现代生活不可或缺的工具&#xff0c;然而&#xff0c;当我们面对电脑开机缓慢的问题…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

shell脚本自动化执行jar包

需要用shell脚本来自动化执行jar包&#xff0c;以后可以用jenkins来CI/CD&#xff0c;记录一下对应实现。 实现需求 以命令行执行shell传入的第一个参数为jar名进行执行。对应jar已存在执行进程&#xff0c;关闭对应进程后再执行。以后台方式执行对应的jar包&#xff0c;输出…

pymysql执行非查询语句会自动提交事务,关闭事务自动提交

一、前置条件 在mysql数据库生成数据&#xff1a; CREATE DATABASE mydatabase;CREATE TABLE Course (CourseID INT PRIMARY KEY,CourseName VARCHAR(100),Instructor VARCHAR(100),Credits INT,StudentID INT,FOREIGN KEY (StudentID) REFERENCES StudentInformation(Studen…

基于微信小程序四六级助手系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W…