某系统采用账号、密码实现登录接口,但随着业务发展和技术进步,需要扩展其他登录方式,如QQ登录、微信登录、手机登录等等,但要同时保留用户和密码登录的方式。写一个“极简”第三方登录来扩展原系统的登录接口,同时保证符合开闭原则。 知识扩展:第三方登录的流程如下。 选择第三方登录,如QQ,系统会自动进行QQ的https://graph.qq.com/oauth2.0认证页面,如果用户在QQ登录成功,QQ会再把用户重定向回需要登录的系统,并登录成功。 附原系统登录模块: public class PassportService { //注册方法 public void regist(String username,String password){ System.out.println("注册成功!"); } //登录方法 public void login(String username,String password){ System.out.println("登录成功!"); } }
时间: 2023-06-04 18:06:07 浏览: 184
我可以为您提供一个基于OAuth2.0协议的“极简”第三方登录的扩展方案,同时符合开闭原则。
首先,需要在原系统中增加一个新的登录接口,用于接收第三方登录授权的回调请求,并完成用户信息的获取和验证。可以定义一个新的PassportOAuthService类,用于处理第三方登录相关逻辑,代码如下:
public class PassportOAuthService {
//处理第三方登录授权回调请求
public void processOAuthCallback(String provider, String code) {
if ("qq".equals(provider)) {
//使用QQ的API获取用户信息
QQAuthAPI qqAuthAPI = new QQAuthAPI();
QQUser qqUser = qqAuthAPI.getUserInfo(code);
//检查用户是否已经注册,如果没有则自动完成注册流程
if (!checkUserExist(qqUser.openId)) {
registByQQ(qqUser);
}
//使用用户名和密码进行登录
login(qqUser.openId, qqUser.accessToken);
} else if ("wechat".equals(provider)) {
//使用微信的API获取用户信息
WechatAuthAPI wechatAuthAPI = new WechatAuthAPI();
WechatUser wechatUser = wechatAuthAPI.getUserInfo(code);
//检查用户是否已经注册,如果没有则自动完成注册流程
if (!checkUserExist(wechatUser.openId)) {
registByWechat(wechatUser);
}
//使用用户名和密码进行登录
login(wechatUser.openId, wechatUser.accessToken);
} else if ("phone".equals(provider)) {
//使用手机号和验证码进行登录
//待实现
}
}
//检查用户是否已经注册
private boolean checkUserExist(String openId) {
//待实现
return false;
}
//使用QQ登录并自动注册
private void registByQQ(QQUser qqUser) {
//待实现
}
//使用微信登录并自动注册
private void registByWechat(WechatUser wechatUser) {
//待实现
}
//使用用户名和密码进行登录
private void login(String username,String password){
PassportService passportService = new PassportService();
passportService.login(username, password);
}
}
其中,QQAuthAPI和WechatAuthAPI是封装了QQ和微信API的类,用于获取用户信息。QQUser和WechatUser是封装了用户信息的类,包括openid、access_token等信息。
在原系统中,需要增加一个新的Servlet或Controller,用于接收第三方登录授权回调请求,并将请求转发给PassportOAuthService类进行处理。代码如下:
public class OAuthCallbackServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String provider = req.getParameter("provider");
String code = req.getParameter("code");
//将授权回调请求交给PassportOAuthService处理
PassportOAuthService passportOAuthService = new PassportOAuthService();
passportOAuthService.processOAuthCallback(provider, code);
}
}
最后,在第三方登录按钮上,需要增加跳转到第三方登录页面的链接。例如,在QQ登录按钮上增加如下链接:
<a href="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=YOUR_APP_ID&redirect_uri=YOUR_REDIRECT_URI">QQ登录</a>
其中,YOUR_APP_ID和YOUR_REDIRECT_URI需要替换为实际的值。
通过以上的扩展,我们可以在原系统中增加QQ、微信、手机等多种第三方登录方式,并保证了系统的扩展性和开闭原则。
阅读全文