单点登录 API
外接应用登录到steedos
准备事项
1、 steedos平台需要配置环境变量开启单点登录功能,在 .env.local中添加:
# JWT SSO
STEEDOS_IDENTITY_JWT_ENABLED=true
过程描述
1、外接应用在自定义服务端接口中生成jwt
2、外接应用在浏览器端跳转至steedos接口 GET {root_url}/accounts/jwt/login?t={jwt}&redirect={redirectURL}
实现单点登录;
示例
1、steedos里新建应用 指定好 API名称(如:finance)、API密钥(如:app_api_secret);
2、外接应用前端按钮调用自定义接口(如:GET /api/get/token),在自定义接口中生成jwt;
module.exports = {
sso: function (object_name, record_id) {
const getTokenURL = '/api/get/token'; // 自定义接口
// 生成令牌
const result = Steedos.authRequest(getTokenURL, {
type: 'GET',
async: false,
contentType: 'application/json'
});
const token = result.token;
const PLATFORM_ROOT_URL = 'https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io' // steedos访问地址,由steedos提供
// 跳转到steedos
window.open(`${PLATFORM_ROOT_URL}/accounts/jwt/login?t=${token}&redirect=${PLATFORM_ROOT_URL}`, '_blank') // 浏览器打开新窗口
},
ssoVisible: function () {
return true
}
}
3、自定义服务端接口。
// nodejs示例
const express = require("express");
const router = express.Router();
const core = require('@steedos/core');
const jwt = require('jsonwebtoken');
/**
* 生成令牌
*/
router.get('/api/get/token', core.requireAuthentication, async function (req, res) {
const userSession = req.user;
var secret = 'app_api_secret' // 应用的API 密钥,由steedos提供
var options = { expiresIn: 30 } // 30秒有效
var token = jwt.sign({
profile: {
email: userSession.email // 当前用户邮件
},
app_code: 'finance' // 应用的API 名称,由steedos提供
}, secret, options);
res.status(200).send({
token: token
});
});
exports.default = router;
steedos登录到外接应用
过程描述
1、steedos里新建应用,指定好 外部链接、API密钥;
2、应用程序启动器中点击外接应用跳转到外部链接并在url上带上 t 参数
3、外接应用解析 t 参数,成功后跳转到应用内
示例
1、steedos里新建应用,指定外部链接(如:GET https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso )、API密钥(如:app_api_secret)
2、应用程序启动器中点击外接应用跳转到外部链接
https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso?t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4
3、外接应用解析令牌
// nodejs 示例
const express = require("express");
const router = express.Router();
const jwt = require('jsonwebtoken')
router.get('/api/sso', async function (req, res) {
console.log(req.query)
// {
// t: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4'
// }
const payload = jwt.verify(req.query.t, 'app_api_secret') // 使用配置的 API密钥 验证并解析信息
console.log(payload)
// {
// profile: {
// name: 'xxx',
// username: 'xxxxxx',
// email: 's@s.com'
// },
// iat: 1669266046,
// exp: 1669269646
// }
res.status(200).send({ message: 'router ok' });
});
exports.default = router;