Oauth2--- 授权码模式(authorization_code)过程

本文详细介绍了OAuth2授权码模式的工作流程,包括获取授权码Code的步骤,涉及的类如DefaultRedirectResolver、JdbcAuthorizationCodeServices等。接着阐述了如何获取访问令牌,核心类如AuthorizationServerTokenServices的角色。最后提到了使用access_token访问资源服务器受保护资源的方法,并展示了PostMan和Curl的示例。
摘要由CSDN通过智能技术生成

一、获取授权码Code:

访问授权服务器 /oauth/authorize 端点:(只用于"implicit", "authorization_code")

GET: http://127.0.0.1:8080/oauth/authorize?client_id=client&response_type=code&redirect_uri=http://www.baidu.com

参数:

(1)response_type=code  必须指定。

  (2) client_id=client  客户端必须指定。

(3)redirect_uri=http:// 重定向地址 必须与数据表一致


结果:如果同意授权: 返回code=cown42 并跳转到redirect_uri=http://www.baidu.com

过程:比较client_id、及redirect_uri、scope、

涉及到核心类:

(1)DefaultRedirectResolver:redirect_uri地址校验。

(2)JdbcAuthorizationCodeServices/InMemoryAuthorizationCodeServices: 生成的code,并保存(code,OAuth2Authentication)在内存或数据库(oauth_code表)

(3)JdbcClientDetailsService: 从表oauth_client_details读取ClientDetails信息,用来校验。

(4)LoginUrlAuthenticationEntryPoint:末登录时,异常由ExceptionTranslationFilter doFilter()---》LoginUrlAuthenticationEntryPoint--》重定向到loginFromUrl页面。

 

public class AuthorizationEndpoint extends AbstractEndpoint {

//一、相关操作:
	private AuthorizationCodeServices authorizationCodeServices = new InMemoryAuthorizationCodeServices();
	private RedirectResolver redirectResolver = new DefaultRedirectResolver();
	private UserApprovalHandler userApprovalHandler = new DefaultUserApprovalHandler();
	private SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore();
	private OAuth2RequestValidator oauth2RequestValidator = new DefaultOAuth2RequestValidator();
   //授权确认页面
	private String userApprovalPage = "forward:/oauth/confirm_access";
	private String errorPage = "forward:/oauth/error";

//二、接口:
@RequestMapping(value = "/oauth/authorize")
	public ModelAndView authorize(Map<String, Object> model, @RequestParam Map<String, String> parameters,SessionStatus sessionStatus, Principal principal) {
 /*1. 通过DefaultOAuth2RequestFactory.createAuthorizationRequest()
    AuthorizationRequest request = new AuthorizationRequest();
从client数据库表加载clietDetails信息
   ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);		
	request.setResourceIdsAndAuthoritiesFromClientDetails(clientDetails);
*/		
AuthorizationRequest authorizationRequest = getOAuth2RequestFactory().createAuthorizationRequest(parameters);

		Set<String> responseTypes = authorizationRequest.getResponseTypes();
        //2.反应类型必须是code
		if (!responseTypes.contains("token") && !responseTypes.contains("code")) {
			throw new UnsupportedResponseTypeException("Unsupported response types: " + responseTypes);
		}
        //3.必须指定clientId
		if (authorizationRequest.getClientId() == null) {
			throw new InvalidClientException("A client id must be provided");
		}

		try {
            //4.访问该端点必须认证isAuthenticated = ture,抛出异常,由ExceptionTranslationFilter doFilter()---》LoginUrlAuthenticationEntryPoint--》重定向到loginFromUrl页面。
			if (!(principal instanceof Authentication) || !((Authentication) principal)
OAuth2.0 Authorization Service通常是指OAuth2.0授权服务器,它是一个组件,用于管理和授权用户对资源的访问。OAuth2.0是一种开放标准,允许用户授权第三方应用(如社交媒体应用)访问他们的私人信息,而无需分享密。 在OAuth2.0流程中,授权服务器的主要职责包括: 1. 用户认证:用户通过客户端应用登录并验证其身份。 2. 授权请求:用户同意客户端应用的访问权限请求,通常是通过一个授权Authorization Code)或JWT(JSON Web Token)。 3. 授权交换:客户端应用将授权发送到授权服务器换取访问令牌(Access Token)和可能的刷新令牌(Refresh Token)。 4. 访问控制:授权服务器根据令牌验证权限,允许或拒绝客户端应用访问特定资源。 要演示这个过程,首先用户会通过客户端应用启动授权流程,然后会被重定向到授权服务器,完成登录并确认授权。之后,服务器会返回一个临时的授权给客户端,客户端使用这个换取长期有效的访问令牌。 ```markdown 1. 用户打开客户端应用,发起OAuth2授权请求。 2. 用户授权后,授权服务器会返回一个授权(`code`): ```shell https://auth-server.com/authorize?code=abc123&state=xyz ``` 3. 客户端应用用授权授权服务器换取访问令牌: ```shell POST /token HTTP/1.1 Content-Type: application/x-www-form-urlencoded Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= grant_type=authorization_code code=abc123 redirect_uri=https://client.com/callback ``` 4. 授权服务器验证并颁发令牌,客户端应用得到访问令牌和可能的刷新令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值