Java中可以使用第三方登录来简化用户登录流程,常见的第三方登录如QQ、微信、微博等。下面是一个Java封装第三方登录的工具类:
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.Map;
-
- import org.apache.http.client.ClientProtocolException;
-
- import com.alibaba.fastjson.JSONObject;
- import com.qq.connect.QQConnectException;
- import com.qq.connect.oauth.Oauth;
- import com.qq.connect.utils.HttpClientUtils;
- import com.qq.connect.utils.QQConnectConfig;
- import com.qq.connect.utils.RandomStatusGenerator;
-
- public class ThirdPartyLoginUtil {
-
- // QQ登录回调地址,需与QQ应用中的回调地址一致
- private static final String CALLBACK_URL = "http://localhost:8080/qq/callback";
-
- /**
- * 获取QQ授权页面地址
- * @param state 随机数,用于防止CSRF攻击
- * @return 授权页面地址
- * @throws QQConnectException
- */
- public static String getQQAuthorizeURL(String state) throws QQConnectException {
- return new Oauth().getAuthorizeURL(CALLBACK_URL, state, "", "");
- }
-
- /**
- * 获取QQ用户信息
- * @param accessToken 访问令牌
- * @param openId 用户在QQ空间的唯一标识符
- * @return 用户信息Map集合
- * @throws QQConnectException
- * @throws ClientProtocolException
- * @throws IOException
- */
- public static Map
getQQUserInfo(String accessToken, String openId) - throws QQConnectException, ClientProtocolException, IOException {
- String url = QQConnectConfig.getValue("getUserInfoURL") + "?access_token=" + accessToken
- + "&oauth_consumer_key=" + QQConnectConfig.getValue("app_ID")
- + "&openid=" + openId;
- String response = HttpClientUtils.get(url);
- JSONObject jsonObject = JSONObject.parseObject(response);
- Map
userInfo = new HashMap(); - userInfo.put("nickname", jsonObject.getString("nickname"));
- userInfo.put("gender", jsonObject.getString("gender"));
- userInfo.put("figureurl", jsonObject.getString("figureurl_qq_2"));
- return userInfo;
- }
-
- /**
- * 生成随机数,用于防止CSRF攻击
- * @return 随机数
- */
- public static String generateState() {
- return RandomStatusGenerator.getUniqueState();
- }
-
- }
以上代码基于QQ登录进行封装,其他第三方登录可根据需求进行修改。使用时,可以先在配置文件中设置QQ应用的App ID和App Key:
- app_ID=your_app_id
- app_Key=your_app_key
- getUserInfoURL=https://graph.qq.com/user/get_user_info
然后在登录页面中生成随机数和授权链接:
<a href="<%=ThirdPartyLoginUtil.getQQAuthorizeURL(ThirdPartyLoginUtil.generateState())%>">QQ登录a>
在回调页面中获取访问令牌和用户信息(需验证state参数):
- String stateInSession = (String) request.getSession().getAttribute("state");
- String state = request.getParameter("state");
- if (!state.equals(stateInSession)) {
- // 非法访问
- }
- String code = request.getParameter("code");
- AccessToken accessTokenObj = new Oauth().getAccessTokenByCode(code, ThirdPartyLoginUtil.CALLBACK_URL);
- String accessToken = accessTokenObj.getAccessToken();
- String openId = new OpenID(accessToken).getUserOpenID();
- Map
userInfo = ThirdPartyLoginUtil.getQQUserInfo(accessToken, openId);
获取到用户信息后,可以进行登录操作或跳转到注册页面进行账号绑定。