使用新浪微博开放平台api同步微博内容至自己网站(网站接入第三方平台登录--QQ篇网站登录平台)
优采云 发布时间: 2021-09-28 19:28使用新浪微博开放平台api同步微博内容至自己网站(网站接入第三方平台登录--QQ篇网站登录平台)
网站获取第三方平台登录--QQ篇
网站获取第三方平台登录--微信文章
内容
准备注册开放平台并创建新应用
在新创建的应用程序的信息中,以下信息需要正确,否则在后续请求中重定向地址会不正确。
调试应该在上面的回调地址上进行
获取 App Key 和 App Secret
如上图
业务分析指导用户授权。获得授权码后,前往微博兑换token。如果需要其他操作,token会调用对应的接口。我的业务逻辑
注意:官方不推荐使用uid来判断登录。我这里求简单,就是账号是否绑定
实际开发环境
前端:VUE
后端:SpringBoot
代码
官方开发文档,参考Web网站部分,这个是没用的JS SDK,因为VUE中无法解析SDK的按钮组件
放置登录按钮
在适当的地方放置引导用户登录的元素,按钮等没有具体要求
...
// 微博图标点击按钮
weiboClick() {
window.location.href = "https://api.weibo.com/oauth2/authorize?client_id=你的a*敏*感*词*ey&redirect_uri=你的回调地址";
}
用户点击链接后,会打开微博授权界面
登录后会自动重定向到回调地址,在url中拼接授权成功的代码
因为vue的路由默认是带hash的,所以无法获取url中的参数。这里请直接通过字符串获取参数。
// 截取url参数
getSearchString(key, search) {
let str = search;
str = str.substring(1, str.length);
let arr = str.split('&');
let obj = {};
for (let i = 0; i < arr.length; i++) {
let tmp_arr = arr[i].split("=");
obj[decodeURIComponent(tmp_arr[0])] = decodeURIComponent(tmp_arr[1]);
}
return obj[key];
}
带代码到后台兑换微博token登录
从创建的hook中获取code,并使用code去后端确定登录(后端收到code后去微博界面换取token、uid等信息,并在库判断是否是系统的用户,如果是则通过,不返回绑定提示)
created() {
let code = this.getSearchString("code",window.location.search)
if (code) {
// 获取微博token
user.getWeiBoToken({code: code}).then(res => {
this.afterLogin(res);
})
}
}
// 登录请求后的逻辑处理
afterLogin(res) {
if (res.code === 200) {
let {data} =res
this.set_token(data.token)
this.set_userInfo(data)
this.$message.success(res.msg);
this.$router.push('/dashboard');
} else if (res.code === 201) {
// 将uid赋值到登录的参数对象中用以登录绑定
this.param.weiboId = res.data;
this.$message.error("你的微博尚未绑定账户,请进行密码登录进行绑定!");
} else {
this.$message.error(res.msg);
}
}
后端接口
代币文件的官方交换
/**
* 微博token接口返回对象
* @ClassName WeiBo
* @Author snow
* @Date 2021/1/21 17:58
*/
@Getter
@Setter
public class WeiBoToken {
private String access_token;
private String remind_in;
private String expires_in;
private String uid;
private String isRealName;
}
/**
* 微博登录
* @param code 微博回调获取的code
* @return 登录成功、失败、需要绑定账号
*/
@GetMapping("/getWeiBoToken")
public JSONObject getWeiBoToken(String code) {
if (DataOperateUtil.isNull(code)) {
return fail("缺少code");
}
RestTemplate restTemplate = new RestTemplate();
MultiValueMap header = new LinkedMultiValueMap();
header.put(HttpHeaders.CONTENT_TYPE, Collections.singletonList(MediaType.APPLICATION_JSON_VALUE));
header.put(HttpHeaders.ACCEPT, Collections.singletonList(MediaType.APPLICATION_JSON_VALUE));
HttpEntity request = new HttpEntity(new JSONObject(), header);
String url = "https://api.weibo.com/oauth2/access_token?client_id=1224469031&client_secret=fa36b19aa07f3362623adf702bf70837&grant_type=authorization_code&redirect_uri=http://sybm.jxsycm.com&code=" + code;
try {
// 请求微博换取token、uid等信息
ResponseEntity exchangeResult = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
System.out.println(exchangeResult);
WeiBoToken weiBoToken = JSON.toJavaObject(JSONObject.parseObject(exchangeResult.getBody()), WeiBoToken.class);
// 判断该微博id是否在库中关联了用户
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("weibo_id", weiBoToken.getUid());
queryWrapper.ne("`status`", 0);
SysUser sysUser = sysUserService.getOne(queryWrapper);
if (sysUser == null) {
// 没有绑定账号
return success(201, weiBoToken.getUid());
} else {
// 已获取到用户信息,进行登录(token处理、日志记录等操作)
return loginService(sysUser);
}
} catch (HttpClientErrorException e) {
e.printStackTrace();
}
return fail("请求微博token异常");
}
如果没有绑定账号,在前端用账号和密码登录,在login方法中判断uid是否有值,如果有则进行登录绑定操作。
submitForm() {
this.$refs.login.validate(valid => {
if (valid) {
if (this.param.weiboId) {
// 进行登录绑定
user.weiboBindAccount(this.param).then(res=>{
this.afterLogin(res)
})
} else {
user.login(this.param).then(res=>{
this.afterLogin(res)
})
}
} else {
this.$message.error('请输入账号和密码');
console.log('error submit!!');
return false;
}
});
}
登录绑定接口
/**
* 微博绑定账号
* @param param username、password、微博id
* @return 绑定后进行登录
*/
@PostMapping("/weiboBindAccount")
public JSONObject weiboBindAccount(@RequestBody SysUser param) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(param.getUsername(), param.getPassword());
try {
...
SysUser sysUser = ...
...
// 登录成功
// 绑定weiboId到账户
sysUser.setWeiboId(param.getWeiboId());
sysUserService.updateById(sysUser);
return loginService(sysUser);
} catch (AuthenticationException e) {
LogUtil.addLogToFile(param.toString(), "登录异常", "", LogUtil.LogLevel.error, e.getMessage());
return fail("账号或密码错误");
}
}
以上,微博登录完成!