# experiment4
**Repository Path**: Graycat-wj/experiment4
## Basic Information
- **Project Name**: experiment4
- **Description**: 企业框架实验4-码云OAuth2第三方登陆
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-05-18
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 实验四 基于Spring Security码云OAuth2认证
#### 课程名称:企业级开发框架专题 学期:2020春季
|
实验名称 | 基于Spring Security码云OAuth2认证 | 实验序号 | 四 |
|
姓 名 | 林伟佳 | 学 号 | 201741404125 | 班 级 | 17软工1班 |
|
实验地点 | 网上 | 实验日期 | 2020/05/14 | 指导老师 | 黎志雄 |
|
教师评语 | | 实验成绩 | 评阅教师 |
| 百分制 | |
|
同组同学 | 无 |
#### 一、 实验目的
1、 掌握使用Spring Security框架;
2、 掌握配置Spring Security的安全过滤链;
3、 掌握编写Spring Security单元测试;
4、 掌握创建接入码云的应用;
5、 掌握码云OAuth2认证基本流程;
6、 掌握使用码云API;
7、 了解使用模板引擎或前端框架制作用户登录界面。
#### 二、 实验环境
1、 JDK 1.8或更高版本
2、 Maven 3.6+
3、 IntelliJ IDEA
#### 三、实验任务
1) 步骤一:创建接入码云的应用。
参考码云的参考文档:[码云OAth2参考文档](https://gitee.com/api/v5/oauth_doc#/list-item-3)之后创建应用

2) 步骤二:编写重定向过滤器的业务逻辑。
当用户访问/oauth2/gitee时,本重定向过滤器拦截请求,并将用户重定向到码云三方认证页面上。
```
//////////////////////////////////////////////////////////////
/// 步骤二:编写重定向过滤器的业务逻辑。
/// 当用户访问/oauth2/gitee时,本重定向过滤器拦截请求,并将用户重定向到码云三方认证页面上。
String myPath = "https://gitee.com/oauth/authorize?client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URI+"&response_type=code";
response.sendRedirect(myPath);
//////////////////////////////////////////////////////////////
```
3) 步骤三:使用码云access_token API向码云认证服务器发送post请求获取access_token。
**注意** :可以用UriCompentsBuilder构造uri也可以直接拼接字符串得到。
```
private String getAccessToken(String code) {
////////////////////////////////////////////////////
/// 步骤三:使用码云access_token API向码云认证服务器发送post请求获取access_token。
// String request_url = UriComponentsBuilder.fromUriString(ACCESS_TOKEN_API_URI)
// .buildAndExpand(code, CLIENT_ID, REDIRECT_URI, CLIENT_SECRET).toString();
String MY_ACCESS_TOKEN_API_URI = "https://gitee.com/oauth/token?grant_type=authorization_code&code="+code+"&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URI+"&client_secret="+CLIENT_SECRET;
RequestEntity requestEntity = RequestEntity
.post(URI.create(MY_ACCESS_TOKEN_API_URI))
.headers(httpHeaders -> httpHeaders.add("User-Agent","Graycat"))
.build();
ResponseEntity response = rest.exchange(requestEntity, String.class);
String result = response.getBody();
Map parseMap = new JacksonJsonParser(new ObjectMapper()).parseMap(result);
System.out.println("access_token获取情况:"+(String) parseMap.get("access_token"));
return (String) parseMap.get("access_token");
////////////////////////////////////////////////////
}
```
4) 步骤四:使用码云API获取授权用户的资料。
码云参考文档:https://gitee.com/api/v5/swagger#/getV5User
```
private Map getUserInfo(String accessToken) {
////////////////////////////////////////////////////
/// 步骤四:使用码云API获取授权用户的资料。
/// 参考:https://gitee.com/api/v5/swagger#/getV5User
/// 可以用UriCompentsBuilder构造uri也可以直接拼接字符串得到。
// String String request_url = UriComponentsBuilder.fromUriString(USER_INFO_URI)
// .buildAndExpand(access_token).toString();
String MY_USERINFO_URI = "https://gitee.com/api/v5/user?access_token="+accessToken;
RequestEntity requestEntity = RequestEntity
.get(URI.create(MY_USERINFO_URI))
.headers(httpHeaders -> httpHeaders.add("User-Agent","Graycat"))
.build();
ResponseEntity