access_token 读取兼容 Bearer Token 方式

This commit is contained in:
click33 2024-08-24 03:46:03 +08:00
parent a7a3e8c14f
commit 2d13e908b1
6 changed files with 46 additions and 21 deletions

View File

@ -4,8 +4,6 @@ import cn.dev33.satoken.oauth2.SaOAuth2Manager;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.net.MalformedURLException;
/** /**
* 启动Sa-OAuth2 Server端 * 启动Sa-OAuth2 Server端
* @author click33 * @author click33
@ -13,7 +11,7 @@ import java.net.MalformedURLException;
@SpringBootApplication @SpringBootApplication
public class SaOAuth2ServerApplication { public class SaOAuth2ServerApplication {
public static void main(String[] args) throws MalformedURLException { public static void main(String[] args) {
SpringApplication.run(SaOAuth2ServerApplication.class, args); SpringApplication.run(SaOAuth2ServerApplication.class, args);
System.out.println("\nSa-Token-OAuth2 Server端启动成功配置如下"); System.out.println("\nSa-Token-OAuth2 Server端启动成功配置如下");
System.out.println(SaOAuth2Manager.getServerConfig()); System.out.println(SaOAuth2Manager.getServerConfig());

View File

@ -1,6 +1,7 @@
package com.pj.oauth2; package com.pj.oauth2;
import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.oauth2.SaOAuth2Manager;
import cn.dev33.satoken.oauth2.config.SaOAuth2ServerConfig; import cn.dev33.satoken.oauth2.config.SaOAuth2ServerConfig;
import cn.dev33.satoken.oauth2.processor.SaOAuth2ServerProcessor; import cn.dev33.satoken.oauth2.processor.SaOAuth2ServerProcessor;
import cn.dev33.satoken.oauth2.template.SaOAuth2Util; import cn.dev33.satoken.oauth2.template.SaOAuth2Util;
@ -8,7 +9,6 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult; import cn.dev33.satoken.util.SaResult;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
@ -63,8 +63,9 @@ public class SaOAuth2ServerController {
// 获取 userinfo 信息昵称头像性别等等 // 获取 userinfo 信息昵称头像性别等等
@RequestMapping("/oauth2/userinfo") @RequestMapping("/oauth2/userinfo")
public SaResult userinfo(@RequestParam("access_token") String accessToken) { public SaResult userinfo() {
// 获取 Access-Token 对应的账号id // 获取 Access-Token 对应的账号id
String accessToken = SaOAuth2Manager.getDataResolver().readAccessToken(SaHolder.getRequest());
Object loginId = SaOAuth2Util.getLoginIdByAccessToken(accessToken); Object loginId = SaOAuth2Util.getLoginIdByAccessToken(accessToken);
System.out.println("-------- 此Access-Token对应的账号id: " + loginId); System.out.println("-------- 此Access-Token对应的账号id: " + loginId);

View File

@ -40,8 +40,9 @@
2. oauth2-client 第三方公司端 2. oauth2-client 第三方公司端
1. 第三方公司登录 oauth-server 数据前台申请端,申请注册应用,拿到 `clientId`、`clientSecret` 等数据。 1. 第三方公司登录 oauth-server 数据前台申请端,申请注册应用,拿到 `clientId`、`clientSecret` 等数据。
2. 在自己系统通过 `clientId`、`clientSecret` 等参数对接 oauth2-server 授权端,拿到 `access_token` 2. 根据自己的业务选择对应的 scope 申请签约,等待平台端审核通过。
3. 通过 `access_token` 调用 oauth2-server 资源端接口,拿到对应资源数据。 3. 在自己系统通过 `clientId`、`clientSecret` 等参数对接 oauth2-server 授权端,拿到 `access_token`
4. 通过 `access_token` 调用 oauth2-server 资源端接口,拿到对应资源数据。
3. 用户端操作 3. 用户端操作
1. 打开第三方公司开发的网站或APP等程序。 1. 打开第三方公司开发的网站或APP等程序。

View File

@ -58,6 +58,7 @@ public class SaOAuth2Consts {
public static String name = "name"; public static String name = "name";
public static String pwd = "pwd"; public static String pwd = "pwd";
public static String build_redirect_uri = "build_redirect_uri"; public static String build_redirect_uri = "build_redirect_uri";
public static String Authorization = "Authorization";
} }
/** /**

View File

@ -18,8 +18,8 @@ package cn.dev33.satoken.oauth2.data.resolver;
import cn.dev33.satoken.context.model.SaRequest; import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.oauth2.data.model.AccessTokenModel; import cn.dev33.satoken.oauth2.data.model.AccessTokenModel;
import cn.dev33.satoken.oauth2.data.model.ClientTokenModel; import cn.dev33.satoken.oauth2.data.model.ClientTokenModel;
import cn.dev33.satoken.oauth2.data.model.request.RequestAuthModel;
import cn.dev33.satoken.oauth2.data.model.request.ClientIdAndSecretModel; import cn.dev33.satoken.oauth2.data.model.request.ClientIdAndSecretModel;
import cn.dev33.satoken.oauth2.data.model.request.RequestAuthModel;
import cn.dev33.satoken.util.SaResult; import cn.dev33.satoken.util.SaResult;
import java.util.Map; import java.util.Map;
@ -42,6 +42,14 @@ public interface SaOAuth2DataResolver {
*/ */
ClientIdAndSecretModel readClientIdAndSecret(SaRequest request); ClientIdAndSecretModel readClientIdAndSecret(SaRequest request);
/**
* 数据读取从请求对象中读取 AccessToken
*
* @param request /
* @return /
*/
String readAccessToken(SaRequest request);
/** /**
* 数据读取从请求对象中构建 RequestAuthModel * 数据读取从请求对象中构建 RequestAuthModel
* @param req SaRequest对象 * @param req SaRequest对象
@ -75,21 +83,10 @@ public interface SaOAuth2DataResolver {
return SaResult.ok(); return SaResult.ok();
} }
/**
* 构建返回值: password 模式认证 获取 token
* @param at token信息
* @return /
*/
default Map<String, Object> buildPasswordReturnValue(AccessTokenModel at) {
return buildTokenReturnValue(at);
}
/** /**
* 构建返回值: 凭证式 模式认证 获取 token * 构建返回值: 凭证式 模式认证 获取 token
* @param ct token信息 * @param ct token信息
*/ */
Map<String, Object> buildClientTokenReturnValue(ClientTokenModel ct); Map<String, Object> buildClientTokenReturnValue(ClientTokenModel ct);
} }

View File

@ -22,8 +22,8 @@ import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts;
import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts.TokenType; import cn.dev33.satoken.oauth2.consts.SaOAuth2Consts.TokenType;
import cn.dev33.satoken.oauth2.data.model.AccessTokenModel; import cn.dev33.satoken.oauth2.data.model.AccessTokenModel;
import cn.dev33.satoken.oauth2.data.model.ClientTokenModel; import cn.dev33.satoken.oauth2.data.model.ClientTokenModel;
import cn.dev33.satoken.oauth2.data.model.request.RequestAuthModel;
import cn.dev33.satoken.oauth2.data.model.request.ClientIdAndSecretModel; import cn.dev33.satoken.oauth2.data.model.request.ClientIdAndSecretModel;
import cn.dev33.satoken.oauth2.data.model.request.RequestAuthModel;
import cn.dev33.satoken.oauth2.exception.SaOAuth2Exception; import cn.dev33.satoken.oauth2.exception.SaOAuth2Exception;
import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaFoxUtil;
import cn.dev33.satoken.util.SaResult; import cn.dev33.satoken.util.SaResult;
@ -56,7 +56,7 @@ public class SaOAuth2DataResolverDefaultImpl implements SaOAuth2DataResolver {
return new ClientIdAndSecretModel(clientId, clientSecret); return new ClientIdAndSecretModel(clientId, clientSecret);
} }
// 如果请求参数中没有提供 client_id 参数则尝试从 base auth 中获取 // 如果请求参数中没有提供 client_id 参数则尝试从 Authorization 中获取
String authorizationValue = SaHttpBasicUtil.getAuthorizationValue(); String authorizationValue = SaHttpBasicUtil.getAuthorizationValue();
if(SaFoxUtil.isNotEmpty(authorizationValue)) { if(SaFoxUtil.isNotEmpty(authorizationValue)) {
String[] arr = authorizationValue.split(":"); String[] arr = authorizationValue.split(":");
@ -71,6 +71,33 @@ public class SaOAuth2DataResolverDefaultImpl implements SaOAuth2DataResolver {
throw new SaOAuth2Exception("请提供 client 信息"); throw new SaOAuth2Exception("请提供 client 信息");
} }
/**
* 数据读取从请求对象中读取 AccessToken
*/
@Override
public String readAccessToken(SaRequest request) {
// 优先从请求参数中获取
String accessToken = request.getParam(SaOAuth2Consts.Param.access_token);
if(SaFoxUtil.isNotEmpty(accessToken)) {
return accessToken;
}
// 如果请求参数中没有提供 access_token 参数则尝试从 Authorization 中获取
String authorizationValue = request.getHeader(SaOAuth2Consts.Param.Authorization);
if(SaFoxUtil.isEmpty(authorizationValue)) {
return null;
}
// 判断前缀裁剪
String prefix = TokenType.Bearer + " ";
if(authorizationValue.startsWith(prefix)) {
return authorizationValue.substring(prefix.length());
}
// 前缀不符合返回 null
return null;
}
/** /**
* 数据读取从请求对象中构建 RequestAuthModel * 数据读取从请求对象中构建 RequestAuthModel
*/ */