自定义登录方式
目前AI速搭私有版本支持多种方式来对接登录。要启用自定义登录方式,需要修改 ISUDA_AUTH_ENABLED_LIST
环境变量。(AUTH_ENABLED_LIST 也可以)多个登录方式请用逗号隔开 如 password,email,weixin,oauth,ldap,third
比如:
ISUDA_AUTH_ENABLED_LIST=email,oauth
表示同时开启邮箱登录和 oauth 登录,具体登录相关配置请接着往下看。
自定义登录页
AI速搭私有版本支持自定义登录页,需在应用开启应用独立,共享/独立模式均可(注意平台部署时需要开启一个环境变量ISUDA_ENABLE_APP_AUTH: 'true'),开启后,当前应用「运行态」将走自己的登录验证认证。当用户访问了未授权的页面,则会跳转到应用的登录页.
在独立认证配置页面可选择自定义登录页,自定义登录页在系统页面进行设计,与普通页面设计相同,涉及到平台登录,需要用户实现接口
邮箱登录
首先请确保 ISUDA_AUTH_ENABLED_LIST
中包含了 email
如果开启了邮箱登录,可以通过接收邮件验证码来登录,但需要配置 SMTP。
密码登录
首先请确保 ISUDA_AUTH_ENABLED_LIST
中包含了 password
管理员可以在「组织架构」中添加新成员,管理员可以在组织架构中重置普通用户的密码,普通成员可以在个人中心修改密码。
- ISUDA_PLATFORM_ADMINISTRATORS 平台级别超级管理员邮箱(如果设置为 password 这就是必填的,多个,号分割)
- ISUDA_LOGIN_DEFAULT_PASSWORD 普通用户默认登录密码
- ISUDA_PLATFORM_ADMINISTRATOR_DEFAULT_PASSWORD 管理员默认密码
oauth 2.0 登录
首先请确保 ISUDA_AUTH_ENABLED_LIST
中包含了 oauth。
然后配置
ISUDA_OAUTH_AUTHORIZE_URL
为 oauth 授权地址,通常是 sso 登录地址如:http://xxx.com/login
ISUDA_OAUTH_TOKEN_URL
为 oauth 获取 token 的 api 地址。ISUDA_OAUTH_CLIENT_ID
为 oauth clientIdISUDA_OAUTH_CLIENT_SECRET
为 oauth clientSecretISUDA_OAUTH_SCOPE
默认值为 emailISUDA_OAUTH_INFO_URL
获取用户资料的接口地址。
在申请 oauth 账号的时候如果需要配置回调地址,请填写 http://{{你的域名}}/auth/oauth/callback
。
如果退出的时候想同时退出 sso 服务,可以配置:
ISUDA_OAUTH_LOGOUT_URL
为 http://xxx.com/logout
接入流程
假设你的AI速搭部署在 http://aisuda-server.com
下,然后AI速搭环境变量配置如下:
ISUDA_OAUTH_AUTHORIZE_URL=http://oauth-server.com/oauth
ISUDA_OAUTH_TOKEN_URL=http://oauth-server.com/access_token
ISUDA_OAUTH_CLIENT_ID=dummy_client_id
ISUDA_OAUTH_CLIENT_SECRET=dummy_client_secret
ISUDA_OAUTH_SCOPE=email
ISUDA_OAUTH_INFO_URL=http://oauth-server.com/auth/userinfo
1.首先打开AI速搭登录页面,点击登录框底部的 OAuth 登录,跳转至 http://oauth-server.com/oauth
进行用户校验,地址栏参数大概如下:
http://oauth-server.com/oauth?response_type=code&redirect_uri=http://aisuda-server.com/auth/oauth/callback&client_id=dummy_client_id
2.用户校验成功后,跳转 http://aisuda-server.com/auth/oauth/callback?code=abcd
,code 参数就是 oauth 标准中的 authorization_code
3.然后会调用 ISUDA_OAUTH_TOKEN_URL
接口获取 access_token,请求格式如下:
POST https://oauth-server.com/access_token
grant_type=authorization_code
&client_id=dummy_client_id
&client_secret=dummy_client_secret
&redirect_uri=http://aisuda-server.com/auth/oauth/callback
&code=abcd
返回格式如下:
{
"token_type": "Bearer",
"expires_in": 86400,
"access_token": "l7AxzvRf1fxArtvOWSPGtN8XBiF4PSXuBFFDj_6IVOFFb3RCmdClqAt_Z6xUnX2M1p0nJDNm",
"refresh_token": "lDh0jrOTgugCpGC6_TRchD-N",
"scope": "email" // 可以不返回
}
4.然后会调用 http://oauth-server.com/auth/userinfo
接口,获取用户信息进行登录,请求格式如下:
GET http://oauth-server.com/auth/userinfo
Header
Authorization: Bearer l7AxzvRf1fxArtvOWSPGtN8XBiF4PSXuBFFDj_6IVOFFb3RCmdClqAt_Z6xUnX2M1p0nJDNm
接口通过 Authorization 获取到 access_token 校验用户,然后返回用户信息,用户信息如下:
{
"id": "oauth Id",
"name": "用户名",
"displayName": "用户展示名称",
"email": "邮箱地址"
}
如果返回的不是这个格式,可以通过以下配置来适配。
ISUDA_OAUTH_ID_FIELD
默认为 id 可以修改为如:user.id
ISUDA_OAUTH_NAME_FIELD
默认为 name 同样可以变量路径。ISUDA_OAUTH_DISPLAY_FIELD
默认为 displayName 同样可以变量路径。ISUDA_OAUTH_EMAIL_FIELD
默认为 email 同样可以变量路径。
如果不能返回 email 则会进入绑定邮箱环节,如果想跳过这个环节,可以配置
ISUDA_OAUTH_EMAIL_SUFFIX
为 xxx.com 这样,邮箱机会用 name 和 这个值拼接一个。
第三方登录
首先请确保 ISUDA_AUTH_ENABLED_LIST
中包含了 third。
第三方登录功能主要用于对接内部非 oauth 标准协议的登录系统,只需要实现两个接口就能完成对接。
主要有以下配置
ISUDA_THIRD_AUTH_AUTHORIZE_URL
为第三方登录地址如:http://xxx.com/login?service={{callback}}ISUDA_THIRD_AUTH_PROFILE_URL
获取用户资料接口如:http://xxx.com/profile?code={{code}}ISUDA_THIRD_AUTH_CODE_FIELD
默认为 code 可以配置成其他如 ticketISUDA_THIRD_AUTH_LOGOUT_URL
退出地址,如果希望AI速搭退出的时候把第三方登录也退出的话。
登录流程为:
- 开发一个登录页面,AI速搭在登录的时候会跳转到这个地址,同时将AI速搭回调地址填入
{{callback}}
,比如http://xxx.com/login?service=http://aisuda.com/auth/third
。 - 在这个第三方登录页面里实现用户登录,完成登录后生成一个
code
,这里可以是随机数也可以是用户信息的对称加密,后面的接口需要通过它获取真实用户信息。 - 从 url 里的 service 参数里从取出AI速搭回调地址,将前面的
code
填入,然后通过 302 跳转到AI速搭回调地址,比如http://aisuda.com/auth/third?code=xxx
。 - AI速搭平台会从
code
参数里取出这个值,然后去请求http://xxx.com/profile?code=xxx
获取用户信息,这个接口需要返回如下内容:
{
"email": "xxx@xx.com",
"username": "",
"displayName": "",
"avatar": "",
"phone": ""
}
如果返回 401 code_expired 则自动重新跳转登录
下面是简单的示例代码:
// AI速搭跳转的登录
app.get('/login', (req, res) => {
// 这里是内部登录逻辑,比如渲染一个登录界面
res.render('login');
// 如果已经登录,就直接跳转,并将 code 填入
res.redirect(301, req.query.service + '?code=xxx');
});
// 前面那个登录页面界面的提交地址示例
app.post('/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;
// ... 内部实现的登录逻辑
// code 的生成逻辑可以自己控制,这里为了简化使用 jwt,比如还可以使用 redis,这里的 code 是个 uuid
const code = jwt.sign(
{
email: 'xxx@xx.com',
username: '',
displayName: '',
avatar: '',
phone: ''
},
'secret'
);
res.redirect(301, req.query.service + '?code=' + code);
});
// 前面是通过 jwt 生成的,其实用户信息已经写入 payload 了,所以只需要验证一下就返回
app.get('/profile', (req, res) => {
const code = req.query.code;
jwt.verify(token, 'secret', function (err, decoded) {
if (err) {
// 解析错误,可能是过期了
res.send(401, err);
}
return decoded;
});
});
LDAP 登录
配置 ldap 登录首先需要在 AUTH_ENABLED_LIST
里增加 ldap
,然后配置 ldap 服务相关的环境变量,目前主要有这些:
- ISUDA_LDAP_URL:ldap 服务地址,比如
ldap://xxx.com:389
- ISUDA_LDAP_BIND_DN:ldap 的 bind dn,比如
dc=example,dc=com
- ISUDA_LDAP_BIND_CREDENTIALS:ldap 的 bind credentials 密码
- ISUDA_LDAP_SEARCH_FILTER:search filter,比如
(uid={{username}})
- ISUDA_LDAP_SEARCH_BASE:search base,比如
dc=example,dc=com
接下来是用户信息字段配置,用户登录成功后 ladp 服务应该返回用户信息,对于AI速搭来说,最重要的是 email 字段,通过下面参数配置 email 到底是哪个字段
- ISUDA_LDAP_EMAIL_ATTRIBUTE:默认值是
mail
,如果 email 字段放email
下就改成email
下面两个字段可选,用于获取用户名和昵称
- ISUDA_LDAP_NAME_ATTRIBUTE:返回的用户名字段,默认是
uid
,如果不存在就用登录时输入的用户名 - ISUDA_LDAP_NICKNAME_ATTRIBUTE:返回的用户昵称字段,默认是
cn
微信登录
首先请确保 ISUDA_AUTH_ENABLED_LIST 中包含了 weixin
- ISUDA_WEIXIN_CLIENT_ID 微信应用唯一标识appid,在微信开放平台提交应用审核通过后获得
- ISUDA_WEIXIN_CLIENT_SECRET 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
- ISUDA_WEIXIN_SCOPE 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login