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

一、获取授权码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)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-security-oauth2-authorization-server是一个基于Spring Security的OAuth 2.0授权服务器,用于为客户端提供安全的访问资源的授权服务。您可以按照以下步骤使用该库: 1. 在您的Spring Boot项目中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.1.0.RELEASE</version> </dependency> ``` 2. 配置您的授权服务器 在您的Spring Boot应用程序中创建一个配置类,并使用@EnableAuthorizationServer注释启用授权服务器。例如: ```java @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { // ... } ``` 3. 配置您的客户端 您可以使用ClientDetailsServiceConfigurer配置您的客户端。例如: ```java @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("client") .secret("{noop}secret") .authorizedGrantTypes("authorization_code", "refresh_token") .scopes("read", "write") .autoApprove(true) .redirectUris("http://localhost:8080/login/oauth2/code/") .and() .withClient("resource") .secret("{noop}secret") .authorizedGrantTypes("client_credentials") .scopes("read"); } ``` 上面的代将在内存中配置两个客户端:一个用于授权授权,另一个用于客户端凭证授权。 4. 配置您的用户 您可以使用UserDetailsServiceConfigurer配置您的用户。例如: ```java @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager) .userDetailsService(userDetailsService); } ``` 上面的代将使用authenticationManager进行身份验证,并使用userDetailsService获取用户信息。 5. 启动您的应用程序 现在,您可以启动您的应用程序,并访问http://localhost:8080/oauth/authorize以获取授权
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值