admin管理员组文章数量:1552445
实现网页登录实现qq和微信扫码登录可以分为以下步骤:
-
获取qq或微信开放平台的APPID和APPSECRET,创建应用,并获取授权域名。
-
在后台创建接口,用于前端发送请求获取qq或微信登陆二维码。二维码生成后,将数据返回给前端。
-
前端获取到二维码后,将其展示在页面上。
-
用户使用qq或微信扫描二维码,授权登陆并获取登陆凭证code。
-
将code发送到后端接口,后台使用code获取access_token和openid。
-
使用openid判断用户是否已经在系统中注册,如果没有,则根据获取的用户信息创建新用户,并生成本地用户凭证token。
-
将token存储在系统中,通过cookie或localStorage等方式返回给前端。
-
前端在后续请求中发送token,后台验证token是否有效,并通过token获取用户信息。
以下是基于springboot和vue的示例:
后台实现:
- 在pom.xml文件中添加spring-boot-starter-web和spring-boot-starter-thymeleaf依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
- 创建控制器QQController和WechatController,分别用于处理qq和微信登陆请求:
@RestController
@RequestMapping("/qq")
public class QQController {
@Autowired
private QQAuthService qqAuthService;
@RequestMapping("/login")
public String qqLogin() {
String state = UUID.randomUUID().toString().replaceAll("-", "");
String url = qqAuthService.getAuthorizationUrl(state);
return url;
}
}
@RestController
@RequestMapping("/wechat")
public class WechatController {
@Autowired
private WechatAuthService wechatAuthService;
@RequestMapping("/login")
public String wechatLogin() {
String state = UUID.randomUUID().toString().replaceAll("-", "");
String url = wechatAuthService.getAuthorizationUrl(state);
return url;
}
}
- 创建QQAuthService和WechatAuthService,用于获取授权链接和access_token:
@Service
public class QQAuthService {
private static final String QQ_AUTHORIZATION_URL =
"https://graph.qq/oauth2.0/authorize?response_type=code
&client_id=%s&redirect_uri=%s&state=%s";
private static final String QQ_ACCESS_TOKEN_URL =
"https://graph.qq/oauth2.0/token?grant_type=authorization_code
&client_id=%s&client_secret=%s&code=%s&redirect_uri=%s";
private static final String QQ_OPENID_URL =
"https://graph.qq/oauth2.0/me?access_token=%s";
private String appId = "your_appid";
private String appSecret = "your_appsecret";
private String redirectUri = "your_redirect_uri";
public String getAuthorizationUrl(String state) {
String url = String.format(QQ_AUTHORIZATION_URL, appId, redirectUri, state);
return url;
}
public String getAccessToken(String code) {
String url = String.format(QQ_ACCESS_TOKEN_URL, appId,
appSecret, code, redirectUri);
String response = HttpUtil.get(url);
String accessToken = StringUtil.getParamFromUrl(response, "access_token");
return accessToken;
}
public String getOpenId(String accessToken) {
String url = String.format(QQ_OPENID_URL, accessToken);
String response = HttpUtil.get(url);
String openid = StringUtil.getParamFromUrl(response, "openid");
return openid;
}
}
@Service
public class WechatAuthService {
private static final String WECHAT_AUTHORIZATION_URL =
"https://open.weixin.qq/connect/qrconnect?
appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#
wechat_redirect";
private static final String WECHAT_ACCESS_TOKEN_URL =
"https://api.weixin.qq/sns/oauth2/access_token?appid=%s&
secret=%s&code=%s&grant_type=authorization_code";
private static final String WECHAT_USERINFO_URL =
"https://api.weixin.qq/sns/userinfo?access_token=%s&
openid=%s";
private String appId = "your_appid";
private String appSecret = "your_appsecret";
private String redirectUri = "your_redirect_uri";
public String getAuthorizationUrl(String state) {
String url = String.format(WECHAT_AUTHORIZATION_URL, appId,
redirectUri, state);
return url;
}
public String getAccessToken(String code) {
String url = String.format(WECHAT_ACCESS_TOKEN_URL, appId, appSecret, code);
String response = HttpUtil.get(url);
String accessToken = StringUtil.getParamFromUrl(response, "access_token");
return accessToken;
}
public JSONObject getUserInfo(String accessToken, String openid) {
String url = String.format(WECHAT_USERINFO_URL, accessToken, openid);
String response = HttpUtil.get(url);
JSONObject jsonObject = JSON.parseObject(response);
return jsonObject;
}
}
- 创建拦截器TokenInterceptor,用于拦截请求并验证token:
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if (StringUtil.isNullOrEmpty(token)) {
throw new Exception("token不能为空");
}
UserDTO userDTO = userService.getUserByToken(token);
if (userDTO == null) {
throw new Exception("token无效");
}
request.setAttribute("user", userDTO);
return true;
}
}
- 在WebMvcConfigurer中添加TokenInterceptor拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private TokenInterceptor tokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenInterceptor);
}
}
- 创建UserService,用于根据token获取用户信息:
@Service
public class UserService {
public UserDTO getUserByToken(String token) {
// 根据token获取用户信息
return new UserDTO();
}
}
前端实现:
- 在index.html页面中添加登陆按钮并绑定点击事件:
<button class="btn btn-primary" @click="qqLogin">QQ登陆</button>
<button class="btn btn-primary" @click="wechatLogin">微信登陆</button>
- 创建vue组件Login.vue,用于处理登陆流程:
<template>
<div class="container">
<div class="row">
<div class="col-md-6">
<h3>QQ登陆</h3>
<img :src="qqQrcode" alt="">
</div>
<div class="col-md-6">
<h3>微信登陆</h3>
<img :src="wechatQrcode" alt="">
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "Login",
data() {
return {
qqQrcode: "",
wechatQrcode: "",
intervalId: 0,
};
},
created() {
this.getQQQrCode();
this.getWechatQrCode();
},
methods: {
getQQQrCode() {
axios.get("/qq/login").then((response) => {
this.qqQrcode = response.data;
});
},
getWechatQrCode() {
axios.get("/wechat/login").then((response) => {
this.wechatQrcode = response.data;
});
},
},
};
</script>
<style scoped>
img {
width: 200px;
height: 200px;
}
</style>
- 在路由配置文件中添加Login组件对应的路由:
import Login from "../views/Login.vue";
const routes = [
{
path: "/login",
name: "Login",
component: Login,
},
// other routes
];
const router = new VueRouter({
mode: "history",
base: process.env.BASE_URL,
routes,
});
- 创建main.js文件,并在其中引入相关依赖:
import Vue from "vue";
import App from "./App.vue";
import VueRouter from "vue-router";
import axios from "axios";
Vue.config.productionTip = false;
Vue.use(VueRouter);
Vue.prototype.$axios = axios;
new Vue({
router,
render: (h) => h(App),
}).$mount("#app");
以上就是基于springboot和vue实现网页登录实现qq和微信扫码登录的示例
版权声明:本文标题:网页登录实现qq和微信扫码登录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727288137a1106895.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论