当我们创建的新浪微博互联应用成功后,我们便可以开始使用该应用来实现新浪微博授权操作
- 一、获取 App Key 和 App Secret
1、在“我的应用”,点击应用,查看我们创建的应用的基本信息
这样,我们就获取到了 App Key 和 App Secret
2、将 App Key 和 App Secret,以及该应用的信息放入项目中的配置文件中,我使用的是SpringBoot,我放在了 application.yml 配置文件中
- 二、添加 Maven 依赖
<!-- 网络请求 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
其他依赖,请自行加入
- 三、在页面放置 “新浪微博” 授权登录的 DOM 元素
<a th:href="@{weibo/auth}" class="link" title="新浪微博登录"><i class="layui-icon"></i></a>
- 四、创建 “新浪微博” 授权登录的 Controller,WeiboController.java
1、从配置文件中获取 “新浪微博” 互联信息
/**
* 微博授权中提供的 appid 和 appkey
*/
@Value("${weibo.oauth.appid}")
public String APPID;
@Value("${weibo.oauth.appkey}")
public String APPKEY;
@Value("${weibo.oauth.url}")
public String URL;
定义三个变量,接收 “新浪微博” 互联的信息
2、登录按钮点击后的接口
/**
* 请求授权页面
*/
@GetMapping(value = "/auth")
public String qqAuth(HttpSession session) {
// 用于第三方应用防止CSRF攻击
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
session.setAttribute("state", uuid);
// Step1:获取Authorization Code
String url = "https://api.weibo.com/oauth2/authorize?response_type=code" +
"&client_id=" + APPID +
"&redirect_uri=" + URLEncoder.encode(URL) +
"&state=" + uuid;
return PasswordUtils.redirectTo(url);
}
“新浪微博” 互联的接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面
3、我们在授权页面,登录了 “新浪微博” 账号,并同意授权后,就回到了我们创建应用是设置的回调地址里面了
/**
* 授权回调
*/
@GetMapping(value = "/callback")
public String qqCallback(HttpServletRequest request) throws Exception {
HttpSession session = request.getSession();
// 得到Authorization Code
String code = request.getParameter("code");
// 我们放在地址中的状态码
String state = request.getParameter("state");
String uuid = (String) session.getAttribute("state");
// 验证信息我们发送的状态码
if (null != uuid) {
// 状态码不正确,直接返回登录页面
if (!uuid.equals(state)) {
return PasswordUtils.redirectTo("/login");
}
}
// Step2:通过Authorization Code获取Access Token
String url = "https://api.weibo.com/oauth2/access_token?grant_type=authorization_code" +
"&client_id=" + APPID +
"&client_secret=" + APPKEY +
"&code=" + code +
"&redirect_uri=" + URL;
JSONObject accessTokenJson = WeiboHttpClient.getAccessToken(url);
// 拿到用户的唯一标识--uid
String uid = accessTokenJson.getString("uid");
// Step3: 获取用户信息
url = "https://api.weibo.com/2/users/show.json?access_token=" + accessTokenJson.get("access_token") +
"&uid=" + accessTokenJson.get("uid");
JSONObject jsonObject = WeiboHttpClient.getUserInfo(url);
// 根据openid在数据库中查找是否存在此用户
UserInfo userInfo = userInfoService.getUserInfo(uid, Const.UserCategory.USER_CATEGORY_WEIBO);
// 如果存在此用户,则检查该用户是否合法,返回首页
if (null != userInfo) {
if (2 == userInfo.getStatus()) {
return PasswordUtils.redirectTo("/login");
} else {
session.setAttribute(Const.SYSTEM_USER_SESSION, userInfo);
// 新增一条登录日志
loginLogService.saveLoginLog(userInfo.getId(), ServletUtils.getServletPojo(request));
}
}
// 该用户不存在,则需要新建一个用户保存到数据库中,并登录
else {
// 随机生成账户
String loginAccount = Const.Number.NUMBER_ONE + RandomUtils.getCurrentTimeMillis(Const.Number.NUMBER_EIGHT);
// 随机生成盐值
String salt = PasswordUtils.getSalt();
// 加密后的密码,默认密码123456
String password = PasswordUtils.getMd5("123456", loginAccount, salt);
// 性别
String sexStr = (String) jsonObject.get("gender");
int sex = Const.Sex.SEX_SECRECY;
// 男
if (Const.Sex.SEX_MAN_EN.equals(sexStr)) {
sex = Const.Sex.SEX_MAN;
}
// 女
else if (Const.Sex.SEX_WOMAN_EN.equals(sexStr)) {
sex = Const.Sex.SEX_WOMAN;
}
// 保存新用户
userInfoService.saveUserInfo(loginAccount, jsonObject.getString("name"), jsonObject.getString("description"), password, salt, jsonObject.getString("avatar_hd"), sex, uid, Const.UserCategory.USER_CATEGORY_WEIBO);
// 根据openid在数据库中查找是否存在此用户
userInfo = userInfoService.getUserInfo(uid, Const.UserCategory.USER_CATEGORY_WEIBO);
// 将当前用户保存到session中去
session.setAttribute(Const.SYSTEM_USER_SESSION, userInfo);
// 默认加主号为好友
friendInfoDao.saveFridendInfo(Const.Number.NUMBER_ONE, userInfo.getId());
// 新增一条登录日志
loginLogService.saveLoginLog(userInfo.getId(), ServletUtils.getServletPojo(request));
}
return PasswordUtils.redirectTo("/success");
}
以上代码,从我自己的项目中拷贝而来,如果你直接使用,你需要对其业务代码进行修改
4、第三步代码中所用到的网络接口方法,我放在了 WeiboHttpClient.java 文件中,主要有两个方法
/**
* 获取Access Token
* post
*/
public static JSONObject getAccessToken(String url) throws IOException {
HttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
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;
}
/**
* 获取微博用户信息
* get
*/
public static JSONObject getUserInfo(String url) throws IOException {
JSONObject jsonObject = null;
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
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();
return jsonObject;
}
以上,就是完成 “新浪微博” 授权登录的过程,相比 QQ 授权登录 少了一个获取 openID 的步骤,新浪微博 登录以 uid 作为唯一标识
扫描二维码关注公众号,回复:
10017332 查看本文章
- 五、总结
总结来说如图所示
如您在阅读中发现不足,欢迎留言!!!
下一篇: