起因
最近在接触AI方面的东西,发现OpenWebUI很不错。
有用户系统,可以记住会话内容,还可以自定义模型地址等等。
UI风格也不错,美中不足的有两点。
搜索引擎暂且不谈。
接入现有系统一般需要考虑用户信息如何打通,怎么实现一键登录。
这个我们晚点讲。
安装OpenWebUI
必须是Python 3.11版本。
安装
pip install open-webui
速度会有点慢,建议配置阿里云的源。
临时使用阿里云的源进行安装:
pip install open-webui -i https://mirrors.aliyun.com/pypi/simple/
长期使用参考配置:
https://developer.aliyun.com/mirror/pypi
安装完成之后使用下面的命令启动:
open-webui serve
启动成功会显示OpenWebUI的Banner。
打开浏览器访问:
http://localhost:8080/
第一次会有点慢。原因是OpenWebUI会默认去连接OpenAI的接口。
由于特殊原因,OpenAI接口不可用,导致第一次很慢很慢。
耐心等,过一会好了之后会提示你设置管理员的用户名密码。
OpenWebUI配置
假设现在已经安装完成,需要做的是:
允许新用户注册
左下角头像,选择管理员面板,选择设置-通用。
允许新用户注册,默认用户角色选择: 用户
设置好之后,就可以继续下面的流程了。
实现一键登录的步骤
采用Java实现,逻辑是:
注意,有如下几个需要配置的地方:
代码中使用了hutool工具库。
使用的是Spring Boot 3.2.5,maven的配置文件如下:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
实现代码如下:
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.HashMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 通过接口自动跳转并登陆OpenWebUI
*
* 1. 先登陆,如果登录失败,则注册;
* 2. 注册成功后,自动跳转到OpenWebUI页面.
*
* @author pc
* @since 2025/3/4
*/
@RestController
public class AutoLoginController {
private static final String REGISTER_URL = "https://chat.openwebuitest.com/api/v1/auths/signup";
private static final String LOGIN_URL = "https://chat.openwebuitest.com/api/v1/auths/signin";
private static final String REDIRECT_TOKEN_URL = "https://chat.openwebuitest.com/auth#";
@GetMapping("/auto-register-login")
public Object handleAutoLogin(
HttpServletRequest req, HttpServletResponse resp, @RequestParam String username) {
try {
String email = username + "@example-auto.com";
String password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var loginParams = new HashMap<>();
loginParams.put("email", email);
loginParams.put("password", password);
var loginRes =
HttpRequest.post(LOGIN_URL)
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(loginParams))
.execute();
if (loginRes.isOk()) {
JSONObject jsonResponse = JSONUtil.parseObj(loginRes.body());
String token = jsonResponse.getStr("token");
if (StringUtils.hasLength(token)) {
resp.sendRedirect(REDIRECT_TOKEN_URL + "token=" + token);
return null;
}
}
var registerParams = new HashMap<>();
registerParams.put("name", username);
registerParams.put("password", password);
registerParams.put("email", email);
registerParams.put(
"profile_image_url",
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAq9JREFUeF7tmz9rU3EYhc+9Se+lVUopXSyCIP4ZpOCQRQtOTjo4FAp+BPUrWBxdRMHZTb9Ah44OIjo4STeddGkXt6KkptcruUJoEVL4wXtzuDyZArnv+zs8T04SEpIdvFquxc2GQIYQGxdNEIR4+UCImQ+EIMSNgFke3kMQYkbALA4NQYgZAbM4NAQhZgTM4tAQhJgRMItDQxBiRsAsDg1BiBkBszg0BCFmBMzi0BCEmBEwi0NDEGJGwCwODUGIGQGzODQEIWYEzOLQEISYETCLQ0MQYkbALE5nGpLNndX8nW3lK9dV/9rX8N0DVXvvzXCfHqczQorBloq1h1JeIOR077FX9C/cVbn+XNn8SnMQDYnlPXV77/xtlTeeKl+8OLkOITMS0ju3rvLmM+VLV04kQMgMhPQvbaocbCk7s/rf6QhpUcj401QxeKz+5fsa329uf46kupJ6Je8hLbrQuBXF2iPly9fG/1f9d3Q11OjLa/VWbylfuoqQNoUsbHycQG+KcfBNo88vNPr6Rscf4yWrJSsT6NWhjr7v6PDTE9U/95rTEdKShOPHLNx7q3r4Q793X6ra/3AiAUJmIGTakQhBSAiBznyXRUNCnh/pSxGSzi5kEiEhWNOXIiSdXcgkQkKwpi9FSDq7kEmEhGBNX4qQdHYhkwgJwZq+FCHp7EImERKCNX0pQtLZhUwiJARr+lKEpLMLmURICNb0pQhJZ8fkFAKd+YGqK5YRYmYSIQgxI2AWh4YgxIyAWRwaghAzAmZxaAhCzAiYxaEhCDEjYBaHhiDEjIBZHBqCEDMCZnFoCELMCJjFoSEIMSNgFoeGIMSMgFkcGoIQMwJmcWgIQswImMWhIQgxI2AWh4YgxIyAWRwaghAzAmZxaAhCzAiYxaEhCDEjYBaHhiDEjIBZnL8EWjIDsmw/0QAAAABJRU5ErkJggg==");
var registerRes =
HttpRequest.post(REGISTER_URL)
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(registerParams))
.execute();
if (!registerRes.isOk()) {
return "注册失败: " + registerRes.body();
}
JSONObject jsonResponse = JSONUtil.parseObj(loginRes.body());
String token = jsonResponse.getStr("token");
resp.sendRedirect(REDIRECT_TOKEN_URL + "token=" + token);
return null;
} catch (Exception e) {
return "操作异常: " + e.getMessage();
}
}
}
是不是很简单?