Spring Cloud OAuth2中/oauth/token返回的内容格式是什么
本篇内容介绍了“Spring Cloud OAuth2中/oauth/token返回的内容格式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
目录
背景
实现原理
代码实现
相关类
关键切面拦截器
背景
在前后端分离的项目中,一般后端返回给前端的格式是一个固定的json格式。在这个前提下,Spring Cloud OAuth3 生成access token的请求/oauth/token的返回内容就需要自定义。
访问/oauth/token示例如下:
原始返回值的格式如下:
我们希望使用我们自己固定的json格式,如下:
实现原理
原理就是通过切面编程实现对/oauth/token端点请求的结果进行拦截封装处理,由于/oauth/token是Spring Cloud OAuth3的内部端点,因此需要对相关的Spring源码进行分析。最终定位到
org.springframework.security.oauth3.provider.endpoint.TokenEndpoint.postAccessToken()
方法上。
代码实现
相关类
CodeEnum.java
package com.wongoing.common.model;public enum CodeEnum { SUCCESS(0), ERROR(1); private Integer code; CodeEnum(Integer code) { this.code = code; } public Integer getCode() { return this.code; }}
Result.java
package com.wongoing.common.model;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@NoArgsConstructor@AllArgsConstructorpublic class Result<T> implements Serializable { private T data; private Integer code; private String msg; public static <T> Result<T> of(T data, Integer code, String msg) { return new Result<>(data, code, msg); } public static <T> Result<T> succeed(String msg) { return of(null, CodeEnum.SUCCESS.getCode(), msg); } public static <T> Result<T> succeed(T model, String msg) { return of(model, CodeEnum.SUCCESS.getCode(), msg); } public static <T> Result<T> succeed(T model) { return of(model, CodeEnum.SUCCESS.getCode(), ""); } public static <T> Result<T> failed(String msg) { return of(null, CodeEnum.ERROR.getCode(), msg); } public static <T> Result<T> failed(T model, String msg) { return of(model, CodeEnum.ERROR.getCode(), msg); }}
关键切面拦截器
在uaa项目中定义OauthTokenAspect.java
package com.wongoing.oauth3.filter;import com.wongoing.common.constant.SecurityConstants;import com.wongoing.common.context.TenantContextHolder;import com.wongoing.common.model.Result;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.security.authentication.InsufficientAuthenticationException;import org.springframework.security.core.Authentication;import org.springframework.security.oauth3.common.OAuth3AccessToken;import org.springframework.security.oauth3.common.util.OAuth3Utils;import org.springframework.security.oauth3.provider.OAuth3Authentication;import org.springframework.stereotype.Component;import java.security.Principal;import java.util.Map;@Slf4j@Component@Aspectpublic class OauthTokenAspect { @Around("execution(* org.springframework.security.oauth3.provider.endpoint.TokenEndpoint.postAccessToken(..))") public Object handleControllerMethod(ProceedingJoinPoint joinPoint) throws Throwable { try { Object[] args = joinPoint.getArgs(); Principal principal = (Principal) args[0]; if (!(principal instanceof Authentication)) { throw new InsufficientAuthenticationException("There is no client authentication. Try adding an appropriate authentication filter."); } String clientId = this.getClientId(principal); Map<String, String> parameters = (Map<String, String>) args[1]; String grantType = parameters.get(OAuth3Utils.GRANT_TYPE); //保存租户id TenantContextHolder.setTenant(clientId); Object proceed = joinPoint.proceed(); if (SecurityConstants.AUTHORIZATION_CODE.equals(grantType)) { return proceed; } else { ResponseEntity<OAuth3AccessToken> responseEntity = (ResponseEntity<OAuth3AccessToken>) proceed; OAuth3AccessToken body = responseEntity.getBody(); return ResponseEntity .status(HttpStatus.OK) .body(Result.succeed(body)); } } finally { TenantContextHolder.clear(); } } private String getClientId(Principal principal) { Authentication client = (Authentication) principal; if (!client.isAuthenticated()) { throw new InsufficientAuthenticationException("The client is not authenticated."); } String clientId = client.getName(); if (client instanceof OAuth3Authentication) { clientId = ((OAuth3Authentication) client).getOAuth3Request().getClientId(); } return clientId; }}
其中的常量值:
public abstract class OAuth3Utils {public static final String GRANT_TYPE = "grant_type";}
public interface SecurityConstants { String AUTHORIZATION_CODE = "authorization_code";}
“Spring Cloud OAuth2中/oauth/token返回的内容格式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341