配置OAuth2授权服务器
首先,我们需要配置OAuth2授权服务器。在本示例中,我们将使用Spring Boot和Spring Security来配置OAuth2授权服务器。
首先,我们需要在pom.xml中添加以下依赖:
代码语言:javascript复制<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.4.0</version>
</dependency>
然后,我们需要在application.yml中添加以下配置:
代码语言:javascript复制spring:
security:
oauth2:
client:
registration:
my-client:
client-id: my-client
client-secret: my-secret
scope: read
authorization-grant-type: authorization_code
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-name: My Client
provider:
my-provider:
authorization-uri: http://localhost:8080/oauth/authorize
token-uri: http://localhost:8080/oauth/token
user-info-uri: http://localhost:8080/oauth/userinfo
user-name-attribute: name
在上面的配置中,我们定义了一个OAuth2客户端,并指定了授权类型为授权码授权。我们还指定了OAuth2授权服务器的授权地址、令牌地址和用户信息地址。
然后,我们需要创建一个控制器来处理OAuth2回调请求。在本示例中,我们将使用Spring MVC来处理请求。
代码语言:javascript复制@Controller
public class OAuthController {
@GetMapping("/oauth2/callback")
public String callback() {
return "oauth/callback";
}
}
在上面的代码中,我们定义了一个OAuth回调控制器,并处理回调请求。在这个示例中,我们只返回一个简单的HTML页面。
配置API安全
现在,我们已经配置好了OAuth2授权服务器,接下来我们需要配置API安全,以保护API。
在本示例中,我们将使用Spring Cloud Security来配置API安全。我们需要在pom.xml中添加以下依赖:
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
<version>3.0.4</version>
</dependency>
然后,我们需要在application.yml中添加以下配置:
代码语言:javascript复制spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/oauth/check_token
在上面的配置中,我们定义了一个资源服务器,并指定了JWT令牌的颁发者URI。
接下来,我们需要创建一个安全配置类来配置API安全。在本示例中,我们将使用Java配置来配置API安全。
代码语言:javascript复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and().oauth2ResourceServer().jwt();
}
}
在上面的代码中,我们定义了一个安全配置类,并配置了API安全。我们指定了只有经过OAuth2认证的用户才能访问API。
编写API
现在,我们已经配置好了OAuth2授权服务器和API安全,接下来我们需要编写API。
在本示例中,我们将编写一个简单的API,并使用Spring Web来处理请求。
代码语言:javascript复制@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/greeting")
public String greeting() {
return "Hello, World!";
}
}
在上面的代码中,我们定义了一个简单的API,并返回一个“Hello, World!”字符串。
测试API
现在,我们已经配置好了OAuth2授权服务器、API安全和API,接下来我们可以测试API了。
首先,我们需要启动OAuth2授权服务器。在本示例中,我们将OAuth2授权服务器运行在8080端口。然后,我们需要启动API应用程序。在本示例中,我们将API应用程序运行在8081端口。
现在,我们可以使用curl命令来测试API。首先,我们需要获取OAuth2访问令牌。我们可以使用以下命令来获取OAuth2访问令牌:
代码语言:javascript复制$ curl -X POST http://localhost:8080/oauth/token
-H 'Authorization: Basic bXktY2xpZW50Om15LXNlY3JldA=='
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=http://localhost:8081/oauth2/callback'
在上面的命令中,我们使用了HTTP基本身份验证,以便获取OAuth2访问令牌。我们将客户端ID和客户端密钥编码为Base64字符串,并将其放在Authorization标头中。
接下来,我们需要替换授权码和重定向URI。授权码是我们在上一节中获取的。重定向URI应该是我们在OAuth回调控制器中定义的。
如果一切正常,我们将收到一个OAuth2访问令牌,它的格式类似于以下内容:
代码语言:javascript复制{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.d-KRnAGWUf8Mh7VX9yKk2cqVWCrBg8UZV49jGh6gR0fUWblEuEMDWVdJXKjQ2m7qW8qQ28jltMdy55NvNvOZPDNoGKjJov9XqrOvOvN0z8aFJ1wAKIbZo_7bexryGgB01_xrs9cIyJNywojBtl1lL5-DIY5ceS2nul5qJ3qH4",
"token_type": "bearer",
"expires_in": 3599,
"scope": "read write"
}
接下来,我们可以使用OAuth2访问令牌来访问API。我们可以使用以下命令来测试API:
代码语言:javascript复制$ curl -H "Authorization: Bearer ACCESS_TOKEN" http://localhost:8081/api/greeting
在上面的命令中,我们使用了OAuth2访问令牌来访问API。我们将访问令牌放在Authorization标头中。
如果一切正常,我们将收到一个“Hello, World!”字符串作为API的响应。