为什么原网站建设公司不愿意透露域名管理权限给客户ui培训机构北京
web/
2025/10/2 4:35:56/
文章来源:
为什么原网站建设公司不愿意透露域名管理权限给客户,ui培训机构北京,网站建设 的公,wordpress前端登录插件文章目录 网站授权QQ登录QQ登录的完整流程代码示例1. 添加依赖2. 配置文件3. 实现Service4. 创建Controller 网站授权QQ登录
首先需要去QQ互联申请应用填写网站的相关信息#xff0c;以及回调地址#xff0c;需要进行审核。申请流程暂时不说了#xff0c;百度一下挺多申请失… 文章目录 网站授权QQ登录QQ登录的完整流程代码示例1. 添加依赖2. 配置文件3. 实现Service4. 创建Controller 网站授权QQ登录
首先需要去QQ互联申请应用填写网站的相关信息以及回调地址需要进行审核。申请流程暂时不说了百度一下挺多申请失败案例的解决方案的你懂的现在越来越严格了甚至一个错别字都不让有。
QQ登录的完整流程 用户点击QQ登录 用户在你的前端页面点击QQ登录按钮,发送请求到后端。 重定向到QQ授权页面 后端也可以直接重定向到QQ的授权页面,也可以将授权页面的地址返回给前端, 由前端将用户重定向到QQ的授权页面授权页面的地址通常是一个URL类似于https://graph.qq.com/oauth2.0/authorize?response_typecodeclient_idYOUR_APP_IDredirect_uriYOUR_REDIRECT_URIstateYOUR_STATE 其中 YOUR_APP_ID你在QQ开放平台注册应用时获得的APP ID。YOUR_REDIRECT_URI你在QQ开放平台设置的回调URL。YOUR_STATE一个随机字符串用于防止CSRF攻击。 用户授权 用户在QQ的授权页面点击同意授权。 QQ重定向到回调URL 授权成功后QQ会将用户重定向到你设置的redirectUri并在回调地址的查询参数中加上一个code参数和原先的state。 前端获取code并验证state 前端从回调地址中解析出code参数。同时验证返回的state是否与最初发送的state一致以确保这不是一个CSRF攻击。 state参数也可以交给后端进行验证 这里的回调地址就是QQ互联上面写的回调地址,前端会在这个回调地址的页面发送请求给后端,同时携带code和state参数(这两个参数从回调地址里面取出来的) 前端向后端发送登录请求并携带code和state参数 前端发起请求将code和state发送到后端的/callback接口。 后端获取Access Token 后端使用code向QQ服务器请求访问令牌Access Token。这通常涉及到一个POST请求到https://graph.qq.com/oauth2.0/token带有code、YOUR_APP_ID、YOUR_APP_KEY你的应用密钥和YOUR_REDIRECT_URI作为参数。 后端获取OpenID 使用Access Token后端可以向QQ服务器请求OpenID这是一个代表QQ用户唯一标识的值。 后端获取用户信息 后端使用Access Token和OpenID请求QQ服务器以获取用户的基本信息。 创建或登录用户 后端可以使用从QQ获取的用户信息来 检查数据库中是否已经有一个与此QQ账户关联的用户。如果是则登录该用户。如果不是则创建一个新用户并与该QQ账户关联。 返回结果到前端 后端可以返回一个令牌如JWT或其他标识已登录用户的信息到前端。 前端处理登录状态 前端根据后端的响应处理用户的登录状态例如保存JWT显示用户的信息等。
代码示例
1. 添加依赖
在pom.xml中添加相关的依赖
!-- Spring Boot Web Starter: 提供了创建web应用所需要的所有必要依赖包括内嵌的Tomcat服务器 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency!-- Apache HttpClient: 一个流行的库用于处理HTTP请求 --
dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactId
/dependency!-- Jackson Databind: 用于将Java对象与JSON数据进行序列化和反序列化 --
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId
/dependency
2. 配置文件
在application.properties添加
qq.appIdYOUR_APP_ID
qq.appKeyYOUR_APP_KEY
qq.redirectUrihttp://yourdomain.com/auth/qq/callback3. 实现Service
创建一个QQAuthService用于处理与QQ的交互。
Service
public class QQAuthService {// 从application.properties中读取配置值Value(${qq.appId})private String appId;Value(${qq.appKey})private String appKey;Value(${qq.redirectUri})private String redirectUri;// 创建一个可关闭的HTTP客户端用于发送请求private final CloseableHttpClient httpClient HttpClients.createDefault();/*** 获取Access Token* * param code 从QQ回调URL中获得的授权码* return 返回Access Token* throws IOException 处理HTTP请求可能会出现的IO异常*/public String getAccessToken(String code) throws IOException {// 构建获取Access Token的URLString url https://graph.qq.com/oauth2.0/token?grant_typeauthorization_codeclient_id appId client_secret appKey code code redirect_uri redirectUri;// 创建一个HttpGet请求HttpGet httpGet new HttpGet(url);// 执行该请求并获取响应CloseableHttpResponse response httpClient.execute(httpGet);// 将响应内容转换为字符串String responseStr EntityUtils.toString(response.getEntity());// 解析响应内容提取access_tokenString accessToken responseStr.split()[0].split()[1];return accessToken;}/*** 获取OpenID* * param accessToken Access Token* return 返回OpenID* throws IOException 处理HTTP请求可能会出现的IO异常*/public String getOpenId(String accessToken) throws IOException {// 构建获取OpenID的URLString url https://graph.qq.com/oauth2.0/me?access_token accessToken;// 创建一个HttpGet请求HttpGet httpGet new HttpGet(url);// 执行该请求并获取响应CloseableHttpResponse response httpClient.execute(httpGet);// 将响应内容转换为字符串String responseStr EntityUtils.toString(response.getEntity());// 解析响应内容提取openidString openId responseStr.substring(responseStr.lastIndexOf(:\) 2, responseStr.lastIndexOf(\}));return openId;}/*** 获取用户信息* * param accessToken Access Token* param openId OpenID* return 返回用户信息的JSON字符串* throws IOException 处理HTTP请求可能会出现的IO异常*/public String getUserInfo(String accessToken, String openId) throws IOException {// 构建获取用户信息的URLString url https://graph.qq.com/user/get_user_info?access_token accessToken oauth_consumer_key appId openid openId;// 创建一个HttpGet请求HttpGet httpGet new HttpGet(url);// 执行该请求并获取响应CloseableHttpResponse response httpClient.execute(httpGet);// 将响应内容转换为字符串String responseStr EntityUtils.toString(response.getEntity());// 直接返回用户信息的JSON字符串return responseStr; }
}
4. 创建Controller
RestController
RequestMapping(/auth/qq)
public class QQAuthController {Autowiredprivate QQAuthService qqAuthService;/*** 重定向用户到QQ登录页面。* * param response HttpServletResponse对象用于发送重定向。* param session HttpSession对象用于存储state。* throws IOException 如果重定向失败。*/GetMapping(/login)public void qqLogin(HttpServletResponse response, HttpSession session) throws IOException {// 生成并存储一个唯一的state值String state UUID.randomUUID().toString();session.setAttribute(qq_oauth_state, state);// 构建QQ授权的URLString url https://graph.qq.com/oauth2.0/authorize?response_typecodeclient_id appId redirect_uri URLEncoder.encode(redirectUri, UTF-8) state state;// 当你在移动端上请求登录时,可以在请求中带上displaymobile参数// 系统就会跳转到移动版的QQ登录页面为用户提供更好的体验if (mobile.equals(display)) {url displaymobile;}// 重定向到QQ授权页面response.sendRedirect(url);}/*** 处理QQ授权的回调请求。* * param code QQ授权返回的code。* param state QQ授权返回的state。* param session HttpSession对象用于验证state。* return 用户信息或错误消息。*/GetMapping(/callback)public String qqCallback(RequestParam String code, RequestParam String state, HttpSession session) {// 检查返回的state是否与存储的一致String storedState (String) session.getAttribute(qq_oauth_state);if (storedState null || !storedState.equals(state)) {return Error: state does not match;}try {// 获取并使用AccessToken和OpenIDString accessToken qqAuthService.getAccessToken(code);String openId qqAuthService.getOpenId(accessToken);String userInfo qqAuthService.getUserInfo(accessToken, openId);// 这里可以进行用户注册或登录操作// 这里可以根据用户是新用户还是老用户决定是注册后登录还是直接登录// 然后返回登录用户的信息return userInfo;} catch (IOException e) {return Error occurred during QQ auth: e.getMessage();}}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85426.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!