跳到主要内容

单点登录 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;