赞
踩
说明:本文采用JDK1.8,springboot 采用2.0.6.RELEASE,我这里采用的内存用户配置
pom.xml配置信息如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.6.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.test</groupId>
- <artifactId>Oauth2-mem-test</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>Oauth2-mem-test</name>
- <description>Demo project for Spring Boot</description>
-
- <properties>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR2</spring-cloud.version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-oauth2</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.vintage</groupId>
- <artifactId>junit-vintage-engine</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
现在开始进行OAuth2.0的服务端配置
新建SecurityConfigService类继承WebSecurityConfigurerAdapter。这里的配置为spring security配置,如果对这里不太熟悉的小伙伴可以先了解一个spring security相关的资料。我在下面的代码中配置了一个用户admin,密码为123456,角色为admin
- package com.client;
-
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
- import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
- import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
- import org.springframework.security.crypto.password.PasswordEncoder;
-
- @Configuration
- public class SecurityConfigService extends WebSecurityConfigurerAdapter {
-
-
- @Bean
- public PasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
-
- @Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication().withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("admin");
- }
- }
新建一个类继承AuthorizationServerConfigurerAdapter。
- package com.client;
-
- import org.springframework.context.annotation.Configuration;
- import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
- import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
- import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
- import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
-
- @Configuration
- @EnableAuthorizationServer
- public class OAuthSecurityService extends AuthorizationServerConfigurerAdapter{
-
-
- @Override
- public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
- clients
- // 使用内存设置
- .inMemory()
- // client_id
- .withClient("client")
- .secret(new BCryptPasswordEncoder().encode("123456"))
- .authorizedGrantTypes("authorization_code")
- // 授权范围 允许权限
- .scopes("app")
- // 注册回调地址
- .redirectUris("http://www.baidu.com");
- }
- }
配置完成后,就可以启动项目;访问http://localhost:8080/oauth/authorize?client_id=client&response_type=code
然后弹出如下界面:
输入用户名密码后进入 下一个界面:在这个界面中选择Approve,并点击Authorze后,跳转到我们配置好的回调地方。我这里的回调地方为https://www.baidu.com/?code=Vd7BI4 其中code就是Oauth返回的授权码。
在URL http://localhost:8080/oauth/authorize?client_id=client&response_type=code 中client_id为客户的ID,这个信息是通过withClient这个方法指定的,而response_type参数则是通过authorizedGrantTypes指定。
第三步:取得access_token信息
在我们的回调地方中已经取得了对应的code,这时我们可以通过这个code来取得access_token信息;首先在postman中输入取得access_token接口的地址http://localhost:8080/oauth/token。请求方式为post
postman的Authorization栏目中的username中输入我们指定client_Id;从上面代码可知我这里配置的是client。password栏目输入指定的密码,我这里配置的密码为123456;
切换到body栏目,在这个栏目中,加上这个接口的参数信息,这个接口需要两个参数,分别是grant_type指定认证方案。code指定系统返回的code码。
配置完成后选择发送即得到access_token信息(code使用过一次后失效)。如下:
- {
- "access_token": "12bfc3db-9a94-4a82-815b-45b6c454f68c",
- "token_type": "bearer",
- "expires_in": 43129,
- "scope": "app"
- }
在OAuth中有四种认证方案,分别是authorization_code(授权码),implicit(隐藏式),password(密码式),client credentials(客户端凭证)。
-
- @Override
- public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
- clients
- // 使用内存设置
- .inMemory()
- // client_id
- .withClient("client")
- .secret(new BCryptPasswordEncoder().encode("123456"))
- //开放四种授权方案
- .authorizedGrantTypes("authorization_code","implicit","password","client_credentials")
- .scopes("read","app");
-
- }
批第三方应用首先申请一个授权码,然后再用该码获得令牌。如上面的URLhttp://localhost:8080/oauth/authorize?client_id=client&response_type=code中。client_id为我们通过withClient("client")指定,即client_Id。这个参数用于让服务端知道哪个用户请求服务。response_type为请求认证方案,authorization_code 方式固定为code,另外我们还可以指定redirect_uri参数和scope参数,其中redirect_uri用于指定认证成功后回调哪个接口,scope用于指定允许的权限,即授权范围。由于我们在上面代码中已经指定了,所以我的URL中没有配置,如果改成如下代码,则需要在URL中进行配置redirect_uri参数和scope参数了。
- package com.client;
-
- import org.springframework.context.annotation.Configuration;
- import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
- import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
- import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
- import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
-
- @Configuration
- @EnableAuthorizationServer
- public class OAuthSecurityService extends AuthorizationServerConfigurerAdapter{
-
-
- @Override
- public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
- clients
- // 使用内存设置
- .inMemory()
- // client_id
- .withClient("client")
- .secret(new BCryptPasswordEncoder().encode("123456"))
- .authorizedGrantTypes("authorization_code")
- .scopes("read","app");
-
- }
- }
简单来说这个方式一共分为三步
第一步,客户端-调用/oauth/authorize接口
第二步,服务端-通过调用/oauth/authorize接口时redirect_uri指定的路径进行回调,并加入code参数,即http://redirect_uri?code=xxxxxx。
第三步,客户端-通过回调时返回的code授权码调用/oauth/token接口,这里必需要指定:grant_type=authorization_code参数和code参数。如果在代码中没有指定redirect_uri,则调用这个接口的时候一定要指定redirect_uri。这里服务器会返回一个json,这个Json中的access_token就是令牌了。
有些web是纯前端应用,没有后端,这时就不能用授权码方式了。而这种方式没有授权码这个中间步骤。允许直接向前端发送令牌。所以称为隐藏式,隐藏式需要指定response_type为token,其他参数不做修改。如http://localhost:8080/oauth/authorize?client_id=client&response_type=token&redirect_uri=http://www.baidu.com&scope=read。
如果高度信任某个应用,也可以把用户名密码直接告诉相关的应用。通过用户名和密码来申请令牌。
凭证式是通过应用直接向服务发送命令行请求令牌。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。