Skip to main content

自定义登录方式

目前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 clientId
  • ISUDA_OAUTH_CLIENT_SECRET 为 oauth clientSecret
  • ISUDA_OAUTH_SCOPE 默认值为 email
  • ISUDA_OAUTH_INFO_URL 获取用户资料的接口地址。

在申请 oauth 账号的时候如果需要配置回调地址,请填写 http://{{你的域名}}/auth/oauth/callback

如果退出的时候想同时退出 sso 服务,可以配置:

接入流程

假设你的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 可以配置成其他如 ticket
  • ISUDA_THIRD_AUTH_LOGOUT_URL 退出地址,如果希望AI速搭退出的时候把第三方登录也退出的话。

登录流程为:

  1. 开发一个登录页面,AI速搭在登录的时候会跳转到这个地址,同时将AI速搭回调地址填入 {{callback}},比如 http://xxx.com/login?service=http://aisuda.com/auth/third
  2. 在这个第三方登录页面里实现用户登录,完成登录后生成一个 code,这里可以是随机数也可以是用户信息的对称加密,后面的接口需要通过它获取真实用户信息。
  3. 从 url 里的 service 参数里从取出AI速搭回调地址,将前面的 code 填入,然后通过 302 跳转到AI速搭回调地址,比如 http://aisuda.com/auth/third?code=xxx
  4. 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