如果网站用户量很大的情况,所以我们为网站引入社交登录模块,简化网站的登录与注册逻辑,为用户带来良好的体验。
码云授权三方登录。
我们要遵循OAuth2.0:OAuth是一个开放标准,通过用户授权第三方网站权限访问用户在其他站点上存储的用户信息,对于用户相关的OpenAPI(获取用户信息等…),为了保护用户的安全和隐私,第三方网站访问用户信息前,必须显示的向用户征求授权。
1.gitee上创建应用
2.数据管理->第三方应用
3.创建应用
4.创建完成后
参考gitee的OAuth文档
gitee OAuth文档:https://gitee.com/api/v5/oauth_doc#/list-item-1
流程图:
项目实际流程图:微博替换为Gitee
详细介绍:
准备工作
1.新建一个Gitee
@Data
public class Gitee {
public String CLIENTID;
public String CLIENTSECRET;
public String URL;
}
2.GiteeConfigProperties类
@Component
@ConfigurationProperties(prefix = "gitee.oauth")
@Data
public class GiteeConfigProperties {
public String clientid;
public String clientsecret;
public String callback;
}
3.GiteeConfig类
@Configuration
public class GiteeConfig {
@Bean
public Gitee gitePro(GiteeConfigProperties e){
Gitee gitee = new Gitee();
gitee.setCLIENTID(e.getClientid());
gitee.setCLIENTSECRET(e.getClientsecret());
gitee.setURL(e.getCallback());
return gitee;
}
}
4.applicaiton.yaml配置你的clientid,clientsecret,callback
gitee:
oauth:
clientid: 1df235cb5b450e597a409f9c**********0523f851bd675e5210196faa32b90a0565
clientsecret: ff443864f0ee97155***********10d1f6c0c3abaf97adfc62751f4ef
callback: ****************
项目中各步对应的代码
AB:> AB:我们将我们的gitee按钮导向https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=user_info%20projects%20pull_requests这个地址
这里我让前端代码指向该地址,到后端然后获取到配置文件中的值,新建一个GiteeController类
前端代码
<a th:href="@{gitee/auth}" class="link" title="Gitee登录"><i class="iconfont icon-gitee"></i>gitee登录</a>
后端代码
/**
* 将用户导向到认证页面
*/
@GetMapping("/gitee/auth")
public String qqAuth(HttpSession session) {
// 用于第三方应用防止CSRF攻击
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
session.setAttribute("state", uuid);
// Step1:获取Authorization Code //scope=user_info 就是用户授权信息
String url = "https://gitee.com/oauth/authorize?response_type=code" +
"&client_id=" + gitee.getCLIENTID() +
"&redirect_uri=" + URLEncoder.encode(gitee.getURL()) +
"&scope=user_info";
System.out.println(url);
//将我们导向到gitee认证服务器
return "redirect:"+url;
}
C:用户同意授权后,通过回调地址(上个请求携带的redirect_uri),将用户授权码传给应用服务器。
D:应用服务器使用 access_token API 向 码云认证服务器发送post请求传入 用户授权码 以及 回调地址( POST请求 )
https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
/**
* 获取Access Token
* post
* url:String url = "https://gitee.com/oauth/token?grant_type=authorization_code" +
"&client_id=" + gitee.getCLIENTID() +
"&client_secret=" + gitee.getCLIENTSECRET() +
"&code=" + code +
"&redirect_uri=" + gitee.getURL();
*/
public static JSONObject getAccessToken(String url) throws IOException {
HttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
HttpResponse response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (null != entity) {
String result = EntityUtils.toString(entity, "UTF-8");
return JSONObject.parseObject(result);
}
httpPost.releaseConnection();
return null;
}
E:码云认证服务器返回 access_token(上步返回),应用服务器根据得到的access_token通过Open Api去获取用户信息
应用通过 access_token 访问 Open API 使用用户数据。
/**
/**
* 获取用户信息
* get
*/
public static JSONObject getUserInfo(String url) throws IOException {
JSONObject jsonObject = null;
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
HttpResponse response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "UTF-8");
jsonObject = JSONObject.parseObject(result);
}
httpGet.releaseConnection();
System.out.println("用户信息:"+jsonObject);
return jsonObject;
}
项目图:
1.
2.将用户导到gitee的认证服务器
3.用户同意授权
4.成功跳到商城首页