当前位置 博文首页 > li5672的专栏:使用第三方授权登录自己的网站
如果想要使用Github
为应用授权的话,要先去自己的账户上注册一个应用,点击注册。
名称随便输入,写上自己网站的主页,最后一个是授权成功之后回调的页面。
创建成功之后会看到这个
点一下Generate a new client secret
会生成一个秘钥,只会出现一次,要保存好它,不要泄露出去。后面会用到的。
下面开始写代码了,只是做一个简单的示例,没有特别复杂的。就是文档顶部的四种类型。图片是在iconfont找到,这个不做过多描述了。
function github() {
location.href = `https://github.com/login/oauth/authorize?client_id=39b050937104c9618fee&redirect_uri=http://localhost/me.html`;
}
当点击Github
图标之后会调用这个方法,跳转到授权页面,上面那个用到两个参数
client_id
就是上面应用的client_id
,千万不要把secret
放在前端,不能暴露出来的
redirect_uri
授权成功返回的页面,上面也提到过的。
调用方法之后会跳转到这个页面,输入账号密码登录就可以了。
密码验证成功之后会跳转到http://localhost/me.html?code=ffwgregregregre
,记住这个code
,后面会用到的。
在授权页面授权成功之后,会得到一个授权码,就是上面的code
,拿到这个去后台服务获取用户信息。
要获取到用户信息首页要使用授权码
得到一个令牌,使用这个令牌向Github
请求用户信息。
@GetMapping("github/{code}")
public ResponseEntity getUserInfo(@PathVariable String code) {
String clientId = "";
String secret = "";
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1090));
//获取访问令牌
String body = HttpRequest.post(
String.format("https://github.com/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s", clientId, secret, code)
).header("accept", "application/json").
setProxy(proxy).
execute().
body();
GithubTokenResponse githubTokenResponse = JSON.parseObject(body, GithubTokenResponse.class);
//使用令牌获取用户信息
String userInfo = HttpRequest.get("https://api.github.com/user").
setProxy(proxy).
header("accept", "application/json").
header("Authorization", "token " + githubTokenResponse.getAccess_token())
.execute().body();
return ResponseEntity.ok(userInfo);
}
GithubTokenResponse
public class GithubTokenResponse {
private String access_token;
private String scope;
private String token_type;
}
<body>
<img id="avatar" style="display: none" />
<h1 id="name"></h1>
</body>
let code = getQueryVariable("code");
ajaxGet("github/" + code, function (data) {
let user = data;
avatar.style.display = "block";
avatar.src = user.avatar_url;
document.getElementById("name").innerHTML = user.name;
});
Gitee
和Github
基本是一样的,也是要先注册一个应用,地址在这里,不过多描述了,直接上代码。
@GetMapping("gitee/{code}")
public ResponseEntity getGiteeUser(@PathVariable String code) {
String clientId = "";
String secret = "";
String redirect_uri = "http://localhost/gitee.html";
String url = String.format(" https://gitee.com/oauth/token?grant_type=authorization_code&code=%s&client_id=%s&redirect_uri=%s&client_secret=%s", code, clientId, redirect_uri, secret);
String body = HttpRequest.post(url).execute().body();
GithubTokenResponse githubTokenResponse = JSON.parseObject(body, GithubTokenResponse.class);
String userInfo = HttpRequest.get("https://gitee.com/api/v5/user?access_token=" + githubTokenResponse.getAccess_token()).execute().body();
return ResponseEntity.ok(userInfo);
}
与Github
一致
Email
实现的思路大致就是,输入邮箱之后,后台会向邮箱发送一个链接,通过这个链接激活账户。
<body>
<input id="email" type="text" placeholder="邮箱地址" />
<button onclick="register()">注册</button>
</body>
<script>
function register() {
let value = email.value;
if (value) {
ajaxPost("email/create", { email: value }, function (data) {
console.log(data);
});
}
}
</script>
@PostMapping("/email/create")
public ResponseEntity createEmailUrl(@RequestBody Map<String, String> map) throws UnsupportedEncodingException, MessagingException {
String token = JwtToken.makeToken(map.get("email"), "abc", 60 * 30);
//注意,QQ邮箱或者163邮箱使用的不是登录密码,要去账户里生成授权码
SendEmail sendEmail = new SendEmail("123@qq.com", "password", "smtp.qq.com");
sendEmail.setSubject("邮箱注册");
String emailContent = String.format("<a href='%sauthemail.html?code=%s'>点击注册</a>,30分钟内有效", pageUrl, token);
sendEmail.addContent(emailContent);
sendEmail.addReceive(new ReceiveAccount(map.get("email"), "xx996用户", Message.RecipientType.TO));
sendEmail.setPersonal("xx996管理员");
sendEmail.saveChange();
sendEmail.sendEmail();
return ResponseEntity.ok(token);
}
@GetMapping("/email/{code}")
public ResponseEntity emailInfo(@PathVariable String code) {
Map<String, String> map = new HashMap<>();
if (!JwtToken.verifyToken(code, "abc")) {
ResponseEntity.ok().body((map.put("mess", "身份认证失败")));
}
String emial = JwtToken