• Java第三方登录封装工具类


    Java中可以使用第三方登录来简化用户登录流程,常见的第三方登录如QQ、微信、微博等。下面是一个Java封装第三方登录的工具类:

    1. import java.io.IOException;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import org.apache.http.client.ClientProtocolException;
    5. import com.alibaba.fastjson.JSONObject;
    6. import com.qq.connect.QQConnectException;
    7. import com.qq.connect.oauth.Oauth;
    8. import com.qq.connect.utils.HttpClientUtils;
    9. import com.qq.connect.utils.QQConnectConfig;
    10. import com.qq.connect.utils.RandomStatusGenerator;
    11. public class ThirdPartyLoginUtil {
    12. // QQ登录回调地址,需与QQ应用中的回调地址一致
    13. private static final String CALLBACK_URL = "http://localhost:8080/qq/callback";
    14. /**
    15. * 获取QQ授权页面地址
    16. * @param state 随机数,用于防止CSRF攻击
    17. * @return 授权页面地址
    18. * @throws QQConnectException
    19. */
    20. public static String getQQAuthorizeURL(String state) throws QQConnectException {
    21. return new Oauth().getAuthorizeURL(CALLBACK_URL, state, "", "");
    22. }
    23. /**
    24. * 获取QQ用户信息
    25. * @param accessToken 访问令牌
    26. * @param openId 用户在QQ空间的唯一标识符
    27. * @return 用户信息Map集合
    28. * @throws QQConnectException
    29. * @throws ClientProtocolException
    30. * @throws IOException
    31. */
    32. public static Map getQQUserInfo(String accessToken, String openId)
    33. throws QQConnectException, ClientProtocolException, IOException {
    34. String url = QQConnectConfig.getValue("getUserInfoURL") + "?access_token=" + accessToken
    35. + "&oauth_consumer_key=" + QQConnectConfig.getValue("app_ID")
    36. + "&openid=" + openId;
    37. String response = HttpClientUtils.get(url);
    38. JSONObject jsonObject = JSONObject.parseObject(response);
    39. Map userInfo = new HashMap();
    40. userInfo.put("nickname", jsonObject.getString("nickname"));
    41. userInfo.put("gender", jsonObject.getString("gender"));
    42. userInfo.put("figureurl", jsonObject.getString("figureurl_qq_2"));
    43. return userInfo;
    44. }
    45. /**
    46. * 生成随机数,用于防止CSRF攻击
    47. * @return 随机数
    48. */
    49. public static String generateState() {
    50. return RandomStatusGenerator.getUniqueState();
    51. }
    52. }

    以上代码基于QQ登录进行封装,其他第三方登录可根据需求进行修改。使用时,可以先在配置文件中设置QQ应用的App ID和App Key:

    1. app_ID=your_app_id
    2. app_Key=your_app_key
    3. getUserInfoURL=https://graph.qq.com/user/get_user_info

    然后在登录页面中生成随机数和授权链接:

    <a href="<%=ThirdPartyLoginUtil.getQQAuthorizeURL(ThirdPartyLoginUtil.generateState())%>">QQ登录a>
    

    在回调页面中获取访问令牌和用户信息(需验证state参数):

    1. String stateInSession = (String) request.getSession().getAttribute("state");
    2. String state = request.getParameter("state");
    3. if (!state.equals(stateInSession)) {
    4. // 非法访问
    5. }
    6. String code = request.getParameter("code");
    7. AccessToken accessTokenObj = new Oauth().getAccessTokenByCode(code, ThirdPartyLoginUtil.CALLBACK_URL);
    8. String accessToken = accessTokenObj.getAccessToken();
    9. String openId = new OpenID(accessToken).getUserOpenID();
    10. Map userInfo = ThirdPartyLoginUtil.getQQUserInfo(accessToken, openId);

    获取到用户信息后,可以进行登录操作或跳转到注册页面进行账号绑定。

  • 相关阅读:
    运动耳机品牌排行榜前十名有哪些,2022年六款运动耳机值得入手
    外汇天眼:ASIC年罚款收入高达2.299亿美元,难道是靠罚款吃饭?
    基于Gmssl库静态编译,实现服务端和客户端之间的SSL通信
    软件测试案例 | 气象探测库存管理系统的集成测试计划
    文件包含漏洞
    Android移动开发基础——实训项目:个人财务软件
    【Docker 内核详解】namespace 资源隔离(三):PID namespace
    常用应届生Java开发笔试面试题(更新中)
    C++数据结构X篇_23_快速排序(最快、不稳定的排序)
    SpringCloud 09 Hystrix 服务熔断
  • 原文地址:https://blog.csdn.net/NanCheng_666/article/details/133895281