详细分析Java中的AuthRequest类(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 实战

前言

公共接口,定义了对第三方平台进行授权、登录、撤销授权和刷新 token 的操作

1. 基本知识

先看源码基本API接口:

import me.zhyd.oauth.enums.AuthResponseStatus;
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;/*** JustAuth {@code Request}公共接口,所有平台的{@code Request}都需要实现该接口* <p>* {@link AuthRequest#authorize()}* {@link AuthRequest#authorize(String)}* {@link AuthRequest#login(AuthCallback)}* {@link AuthRequest#revoke(AuthToken)}* {@link AuthRequest#refresh(AuthToken)}** @author yadong.zhang (yadong.zhang0415(a)gmail.com)* @since 1.8*/
public interface AuthRequest {/*** 返回授权url,可自行跳转页面* <p>* 不建议使用该方式获取授权地址,不带{@code state}的授权地址,容易受到csrf攻击。* 建议使用{@link AuthDefaultRequest#authorize(String)}方法生成授权地址,在回调方法中对{@code state}进行校验** @return 返回授权地址*/@Deprecateddefault String authorize() {throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED);}/*** 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state}** @param state state 验证授权流程的参数,可以防止csrf* @return 返回授权地址*/default String authorize(String state) {throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED);}/*** 第三方登录** @param authCallback 用于接收回调参数的实体* @return 返回登录成功后的用户信息*/default AuthResponse login(AuthCallback authCallback) {throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED);}/*** 撤销授权** @param authToken 登录成功后返回的Token信息* @return AuthResponse*/default AuthResponse revoke(AuthToken authToken) {throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED);}/*** 刷新access token (续期)** @param authToken 登录成功后返回的Token信息* @return AuthResponse*/default AuthResponse refresh(AuthToken authToken) {throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED);}
}

大致方法如下:

  • authorize():返回授权 URL,但已被标记为过时 (@Deprecated)。不建议使用此方法获取授权地址,因为不带 state 的授权地址容易受到 CSRF 攻击
  • authorize(String state):返回带 state 参数的授权 URL,授权回调时会带上这个 state,用于验证授权流程的参数,防止 CSRF 攻击
  • login(AuthCallback authCallback):第三方登录方法,用于接收回调参数的实体,并返回登录成功后的用户信息
  • revoke(AuthToken authToken):撤销授权方法,用于撤销登录成功后返回的 Token 信息
  • refresh(AuthToken authToken):刷新 Access Token 方法,用于续期登录成功后返回的 Token 信息

2. Demo

根据上述接口,简单测试下接口功能:

制造一个第三方的类:

package com.example.test;import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.request.AuthRequest;public class GitHubAuthProvider implements AuthRequest {@Overridepublic String authorize(String state) {// 返回 GitHub 授权 URL,并将 state 参数添加到 URL 中return "https://github.com/login/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&state=" + state;}@Overridepublic AuthResponse login(AuthCallback authCallback) {// 模拟 GitHub 登录成功后返回的用户信息return new AuthResponse(200, "Success", "GitHubUser,github@example.com");}@Overridepublic AuthResponse revoke(AuthToken authToken) {// 撤销授权的具体实现return new AuthResponse(200, "Success", "Authorization revoked successfully");}@Overridepublic AuthResponse refresh(AuthToken authToken) {// 刷新 Access Token 的具体实现return new AuthResponse(200, "Success", "Access Token refreshed successfully");}
}

对应的接口测试类如下:

import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.request.AuthRequest;public class test {public static void main(String[] args) {// 创建一个第三方平台的具体实现对象AuthRequest authRequest = new GitHubAuthProvider();// 获取授权 URL,传入 state 参数String authorizeUrl = authRequest.authorize("random_state_parameter");System.out.println("Authorize URL: " + authorizeUrl);// 模拟第三方登录操作,传入 AuthCallback 实体AuthResponse authResponse = authRequest.login(new AuthCallback());System.out.println("Login response: " + authResponse);// 模拟撤销授权操作,传入登录成功后返回的 Token 信息AuthToken authToken = new AuthToken();AuthResponse revokeResponse = authRequest.revoke(authToken);System.out.println("Revoke response: " + revokeResponse);// 模拟刷新 Access Token 操作,传入登录成功后返回的 Token 信息AuthResponse refreshResponse = authRequest.refresh(authToken);System.out.println("Refresh response: " + refreshResponse);}
}

截图如下:(默认的 toString() 方法返回的对象字符串表示形式)

在这里插入图片描述

3. 实战

上述Demo只是一个简易版

在实战中应对各个不同的应用,可以写个模板类

import java.util.Objects;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.config.AuthDefaultSource;
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.request.AuthAlipayRequest;
import me.zhyd.oauth.request.AuthBaiduRequest;
import me.zhyd.oauth.request.AuthCodingRequest;
import me.zhyd.oauth.request.AuthCsdnRequest;
import me.zhyd.oauth.request.AuthDingTalkRequest;
import me.zhyd.oauth.request.AuthDouyinRequest;
import me.zhyd.oauth.request.AuthElemeRequest;
import me.zhyd.oauth.request.AuthFacebookRequest;
import me.zhyd.oauth.request.AuthGiteeRequest;
import me.zhyd.oauth.request.AuthGithubRequest;
import me.zhyd.oauth.request.AuthGitlabRequest;
import me.zhyd.oauth.request.AuthGoogleRequest;
import me.zhyd.oauth.request.AuthHuaweiRequest;
import me.zhyd.oauth.request.AuthKujialeRequest;
import me.zhyd.oauth.request.AuthLinkedinRequest;
import me.zhyd.oauth.request.AuthMeituanRequest;
import me.zhyd.oauth.request.AuthMiRequest;
import me.zhyd.oauth.request.AuthMicrosoftRequest;
import me.zhyd.oauth.request.AuthOschinaRequest;
import me.zhyd.oauth.request.AuthPinterestRequest;
import me.zhyd.oauth.request.AuthQqRequest;
import me.zhyd.oauth.request.AuthRenrenRequest;
import me.zhyd.oauth.request.AuthRequest;
import me.zhyd.oauth.request.AuthStackOverflowRequest;
import me.zhyd.oauth.request.AuthTaobaoRequest;
import me.zhyd.oauth.request.AuthTeambitionRequest;
import me.zhyd.oauth.request.AuthToutiaoRequest;
import me.zhyd.oauth.request.AuthTwitterRequest;
import me.zhyd.oauth.request.AuthWeChatEnterpriseRequest;
import me.zhyd.oauth.request.AuthWeChatMpRequest;
import me.zhyd.oauth.request.AuthWeChatOpenRequest;
import me.zhyd.oauth.request.AuthWeiboRequest;
import org.springblade.core.social.props.SocialProperties;public class SocialUtil {public SocialUtil() {}public static AuthRequest getAuthRequest(String source, SocialProperties socialProperties) {AuthDefaultSource authSource = (AuthDefaultSource)Objects.requireNonNull(AuthDefaultSource.valueOf(source.toUpperCase()));AuthConfig authConfig = (AuthConfig)socialProperties.getOauth().get(authSource);if (authConfig == null) {throw new AuthException("未获取到有效的Auth配置");} else {AuthRequest authRequest = null;switch (authSource) {case GITHUB:authRequest = new AuthGithubRequest(authConfig);break;case GITEE:authRequest = new AuthGiteeRequest(authConfig);break;case OSCHINA:authRequest = new AuthOschinaRequest(authConfig);break;case QQ:authRequest = new AuthQqRequest(authConfig);break;case WECHAT_OPEN:authRequest = new AuthWeChatOpenRequest(authConfig);break;case WECHAT_ENTERPRISE:authRequest = new AuthWeChatEnterpriseRequest(authConfig);break;case WECHAT_MP:authRequest = new AuthWeChatMpRequest(authConfig);break;case DINGTALK:authRequest = new AuthDingTalkRequest(authConfig);break;case ALIPAY:authRequest = new AuthAlipayRequest(authConfig);break;case BAIDU:authRequest = new AuthBaiduRequest(authConfig);break;case WEIBO:authRequest = new AuthWeiboRequest(authConfig);break;case CODING:authRequest = new AuthCodingRequest(authConfig);break;case CSDN:authRequest = new AuthCsdnRequest(authConfig);break;case TAOBAO:authRequest = new AuthTaobaoRequest(authConfig);break;case GOOGLE:authRequest = new AuthGoogleRequest(authConfig);break;case FACEBOOK:authRequest = new AuthFacebookRequest(authConfig);break;case DOUYIN:authRequest = new AuthDouyinRequest(authConfig);break;case LINKEDIN:authRequest = new AuthLinkedinRequest(authConfig);break;case MICROSOFT:authRequest = new AuthMicrosoftRequest(authConfig);break;case MI:authRequest = new AuthMiRequest(authConfig);break;case TOUTIAO:authRequest = new AuthToutiaoRequest(authConfig);break;case TEAMBITION:authRequest = new AuthTeambitionRequest(authConfig);break;case PINTEREST:authRequest = new AuthPinterestRequest(authConfig);break;case RENREN:authRequest = new AuthRenrenRequest(authConfig);break;case STACK_OVERFLOW:authRequest = new AuthStackOverflowRequest(authConfig);break;case HUAWEI:authRequest = new AuthHuaweiRequest(authConfig);break;case KUJIALE:authRequest = new AuthKujialeRequest(authConfig);break;case GITLAB:authRequest = new AuthGitlabRequest(authConfig);break;case MEITUAN:authRequest = new AuthMeituanRequest(authConfig);break;case ELEME:authRequest = new AuthElemeRequest(authConfig);break;case TWITTER:authRequest = new AuthTwitterRequest(authConfig);}if (null == authRequest) {throw new AuthException("未获取到有效的Auth配置");} else {return (AuthRequest)authRequest;}}}
}

类似的Github第三方平台如下:(以下类为API自带的)

import com.alibaba.fastjson.JSONObject;
import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.config.AuthDefaultSource;
import me.zhyd.oauth.enums.AuthUserGender;
import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthToken;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.utils.GlobalAuthUtils;import java.util.Map;/*** Github登录** @author yadong.zhang (yadong.zhang0415(a)gmail.com)* @since 1.0.0*/
public class AuthGithubRequest extends AuthDefaultRequest {public AuthGithubRequest(AuthConfig config) {super(config, AuthDefaultSource.GITHUB);}public AuthGithubRequest(AuthConfig config, AuthStateCache authStateCache) {super(config, AuthDefaultSource.GITHUB, authStateCache);}@Overrideprotected AuthToken getAccessToken(AuthCallback authCallback) {String response = doPostAuthorizationCode(authCallback.getCode());Map<String, String> res = GlobalAuthUtils.parseStringToMap(response);this.checkResponse(res.containsKey("error"), res.get("error_description"));return AuthToken.builder().accessToken(res.get("access_token")).scope(res.get("scope")).tokenType(res.get("token_type")).build();}@Overrideprotected AuthUser getUserInfo(AuthToken authToken) {String response = doGetUserInfo(authToken);JSONObject object = JSONObject.parseObject(response);this.checkResponse(object.containsKey("error"), object.getString("error_description"));return AuthUser.builder().rawUserInfo(object).uuid(object.getString("id")).username(object.getString("login")).avatar(object.getString("avatar_url")).blog(object.getString("blog")).nickname(object.getString("name")).company(object.getString("company")).location(object.getString("location")).email(object.getString("email")).remark(object.getString("bio")).gender(AuthUserGender.UNKNOWN).token(authToken).source(source.toString()).build();}private void checkResponse(boolean error, String error_description) {if (error) {throw new AuthException(error_description);}}}

后续在使用过程的代码如下:

@NonDS
@Slf4j
@RestController
@AllArgsConstructor
@ConditionalOnProperty(value = "social.enabled", havingValue = "true")
public class BladeSocialEndpoint {private final SocialProperties socialProperties;/*** 授权完毕跳转*/@RequestMapping("/oauth/render/{source}")public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());response.sendRedirect(authorizeUrl);}/*** 获取认证信息*/@RequestMapping("/oauth/callback/{source}")public Object login(@PathVariable("source") String source, AuthCallback callback) {AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);return authRequest.login(callback);}/*** 撤销授权*/@RequestMapping("/oauth/revoke/{source}/{token}")public Object revokeAuth(@PathVariable("source") String source, @PathVariable("token") String token) {AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);return authRequest.revoke(AuthToken.builder().accessToken(token).build());}/*** 续期令牌*/@RequestMapping("/oauth/refresh/{source}")public Object refreshAuth(@PathVariable("source") String source, String token) {AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);return authRequest.refresh(AuthToken.builder().refreshToken(token).build());}}

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

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

相关文章

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘&#xff08;SSD&#xff09;健康状况检测工具&#xff0c;旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态&#xff0c;从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先&#xff0c;它能够定…

09-ARM开发板的HelloWorld

在ARM开发板上运行x86_64平台程序 前面在Ubuntu系统编译生成了X86_64平台的HelloWorld程序&#xff0c;通过NFS服务器&#xff0c;尝试在开发板上直接运行。 如图所示&#xff0c;程序无法正常运行&#xff0c;终端提示ARM开发板在执行x86架构&#xff08;Intel或AMD&#xff…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

旅游陪同翻译难吗, 旅游翻译英译中哪家好?

近来&#xff0c;随着中国旅游业的蓬勃发展&#xff0c;旅游陪同翻译的需求也水涨船高&#xff0c;这些专业的翻译服务者为中外游客搭建起友谊的桥梁&#xff0c;引领他们共同探索中国这片古老而神秘的土地 。那么&#xff0c;旅游陪同翻译英译中难吗&#xff1f;我们如何在众多…

mysql数据库连接工具(mysql数据库连接工具怎么备份数据不备份表结构)

MySQLWorkbench连接,导入和导出数据库? 1、导出&#xff1a;使用MySQL Workbench连接到MySQL服务器&#xff0c;选择要导出的数据库&#xff0c;右键单击数据库并选择“导出”。选择要导出的表和数据&#xff0c;将导出文件保存为.sql文件。 2、打开MySQL Workbench&#xf…

OpenHarmony 视图缩放组件—subsampling-scale-image-view

简介 深度缩放视图&#xff0c;图像显示&#xff0c;手势平移缩放双击等 效果图&#xff08;旋转、缩放、平移&#xff09; 下载安装 ohpm install ohos/subsampling-scale-image-view OpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 使…

昂科烧录器支持Nuvoton新唐科技的低功耗微控制器M482SIDAE

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Nuvoton新唐科技的低功耗微控制器M482SIDAE已经被昂科的通用烧录平台AP8000所支持。 M482SIDAE以Arm Cortex-M4F为核心&#xff0c;是带有DSP指令集的高效能低功耗微控制器。其…

基于Spingboot+vue协同过滤音乐推荐管理系统

项目演示视频效果&#xff1a; 基于Spingbootvue协同过滤音乐推荐管理系统 基于Spingbootvue协同过滤音乐推荐管理系统 1、项目介绍 基于Springboot的音乐播放管理系统总共两个角色&#xff0c;用户和管理员。用户使用前端前台界面&#xff0c;管理员使用前端后台界面。 有推荐…

【Win】怎么下载m3u8视频\怎么通过F12开发人员工具获取视频地址\怎么下载完整的.ts格式视频

怎么下载m3u8视频&#xff1f;首先通过浏览器本地的开发人员工具&#xff0c;获取m3u8的地址&#xff0c;然后再通过第三方下载工具下载&#xff0c;此处以N_m3u8DL-CLI_v3.0.2为例 如下图的步骤&#xff0c;即可获取到视频的m3u8地址 打开N_m3u8DL-CLI_v3.0.2&#xff0c;粘贴…

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…

基于Springboot的社区疫情返乡管控系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区疫情返乡管控系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

JavaWeb--06Vue组件库Element

Element 1 Element组件的快速入门1.1 Table表格 1 Element组件的快速入门 https://element.eleme.cn/#/zh-CN Element是饿了么团队开发的 接下来我们来学习一下ElementUI的常用组件&#xff0c;对于组件的学习比较简单&#xff0c;我们只需要参考官方提供的代码&#xff0c;然…

AJAX——图片上传

图片上传流程 1.获取图片文件对象 2.使用FormData携带图片文件 3.提交表单数据到服务器&#xff0c;使用图片url网址 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible"…

STM32使用HAL库解码433遥控芯片EV1527

1、首先了解一下433遥控芯片ev1527的基本资料&#xff1a; 这是他编码的关键信息&#xff1a; 也就是说&#xff0c;一帧数据是&#xff1a;一个同步码20位内码4位按键码。 内码20位2^201048576个地址。 发送就是一帧数据接一帧数据不间断发送。 2、解码思路 从上面的帧结构…

Jmeter测试学习笔记

第一章 jmeter基础知识 一.Jmeter工具中的组件 1.测试计划&#xff1a;Jmeter测试的起点。容器。 2.线程组&#xff1a;代表一定的用户 3.取样器&#xff1a;发送请求的最小单元 4.逻辑控制器&#xff1a;处理请求逻辑 5.前置处理器&#xff1a;请求之前的操作 6.后置处…

公网IP地址如何申请SSL证书?有免费的IP ssl吗?

如果用户没有域名或只有公网IP地址或者不方便使用域名&#xff0c;IP地址ssl证书这一特殊的证书可以为IP地址实现HTTPS的安全保护&#xff0c;提高网站数据传输的安全性。 IP地址申请SSL证书的基本步骤 IP ssl证书下载---注册填写230916https://www.joyssl.com/certificate/sel…

数据可视化(五):Pandas高级统计——函数映射、数据结构、分组聚合等问题解决,能否成为你的工作备用锦囊?

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

【不看后悔】AGI时代,这些工具真的能让你收入翻倍!

引言 在数字化浪潮中&#xff0c;AIGC已经成为不可或缺的一部分 无论你是一名内容创作者&#xff0c;还是简单的社交媒体用户&#xff0c;免费的AI工具都能在多个层面助你一臂之力。这些工具涵盖从文本创作到图像设计&#xff0c;再到视频制作等多个方面&#xff0c;不仅可以…

Amazon云计算AWS之[1]基础存储架构Dynamo

文章目录 Dynamo概况Dynamo架构的主要技术主要问题及解决方案Dynamo的存储节点数据均衡分布的问题一致性哈希算法改进一致性哈希算法 数据备份数据冲突问题成员资格及错误检测容错机制临时故障处理机制永久性故障处理机制 Dynamo概况 面向服务的Amazon平台基本架构为了保证其稳…

C语言学习/复习24---

一、指针的进阶 1.指针的类型 2.字符指针 注意事项1&#xff1a;数组名是首元素地址&#xff0c;指针变量存储地址 3.指针数组 4.数组指针 注意事项1:&数组名与数组名 案例1&#xff1a;数组地址与数组首元素地址 数组地址的使用&#xff1a; ​​​…