我做了一个临时的'sso服务器',我想连接到Wix Answers。Wix 是一个 CMS。Wix Answers是一个帮助中心,您可以在其中处理客户常见问题解答,让客户接收支持视频,并且客户可以输入票证。Wix答案是Wix用于Wix帮助页面的内容,它们使相同的应用程序可用于同一目的。
我的"sso 服务器"是一个指向 Lambda 函数的 AWS API 网关。很简单。您调用公有终端节点并运行以下 lambda:
var express = require('express');
var app = express();
var crypto = require('crypto'); //npm install crypto --save
var base64url = require('base64url'); //npm install base64url --save
var bodyParser = require('body-parser');
var KEY_ID = '1234567'; //note it's a uuid
var SECRET = '1234567xxxxxxxxxxxxxxxxxxxxxxxxxxx';
exports.handler = async (event) => {
//this assumes there is a login or some UI that will receive the needed redirect url
app.get('/login-form', function (request, response) {
var url = require('url');
var urlParts = url.parse(request.url, true);
var query = urlParts.query;
var answersRedirectUrl = query.redirectUrl;
//of course, in a real system the data will come from your own user system
var dummyUserData = {
id: 'your-user-id',
email: 'user@email.com',
firstName: 'Bob2',
lastName: 'Bobson',
profileImage: 'https://i.ytimg.com/vi/-90CAdWk27I/maxresdefault.jpg',
timestamp: Date.now()
};
var token = encryptUserData(JSON.stringify(dummyUserData), SECRET);
response.redirect(answersRedirectUrl + '&token=' + token + '&key=' + KEY_ID);
});
};
function encryptUserData(data, key) {
var iv = new Buffer('');
var bytes = new Buffer(key, 'utf-8');
var hashedKey = crypto.createHash('sha1').update(bytes).digest().slice(0, 16);
var cipher = crypto.createCipheriv('aes-128-ecb', hashedKey, iv);
var crypted = cipher.update(data, 'UTF-8', 'hex');
crypted += cipher.final('hex');
return base64url(new Buffer(crypted, 'hex'));
}
此代码是代码的 lambda 修改版本 Wix 回答示例 js 代码来自这里。 https://help.wixanswers.com/en/article/setting-up-single-sign-on-sso-for-your-users
有依赖项,我已经将它们全部加载到 lambda 中,所以这不是依赖项问题。
Wix 答案 是一个简单的设置,你给他们一个登录和注销的网址。 您在Wix答案仪表板中生成一个密钥,我已经将该密钥添加到下面的lambda中(下面的密钥显然被掩盖了(。我已将我的端点添加到 wix 答案中的字段。
我得到了一个null
响应,并且能够获得一个对象,对象.message ="missing auth token"
专注于JS和lambda,我遗漏了什么会使它不起作用。同样,在快速和这些依赖项或SSO方面的经验并不多。
谢谢!!
Wix 有一些很好的工具,但有时缺乏文档。这是我解决这个问题的方法:
教程 https://help.wixanswers.com/en/article/setting-up-single-sign-on-sso-for-your-users
他们来自 https://gist.github.com/GabiGrin/0c92ecbb071e02e2d91c8d689517acd7#file-answers-sso-example-js 的JS代码
我做了什么
//encrypt.js
var crypto = require('crypto'); //built in to node
var base64url = require('base64url'); //requires install 'npm install base64url'
var KEY_ID = 'abcedfghijklmnopqrstuvwxyz'; //from Wix Answers
var SECRET = 'fakefakefakefakefakefake'; //from Wix Answers
let user = {
id: '123456',
email: 'email@domain.com',
firstName: 'Homer',
lastName: 'Simpson',
profileImage: 'https://i.ytimg.com/vi/-90CAdWk27I/maxresdefault.jpg',
timestamp: Date.now()
};
function encryptUserData(data, key) {
var iv = new Buffer('');
var bytes = new Buffer(key, 'utf-8');
var hashedKey = crypto.createHash('sha1').update(bytes).digest().slice(0, 16);
var cipher = crypto.createCipheriv('aes-128-ecb', hashedKey, iv);
var crypted = cipher.update(data, 'UTF-8', 'hex');
crypted += cipher.final('hex');
return base64url(new Buffer(crypted, 'hex'));
}
var token = encryptUserData(JSON.stringify(user), SECRET);
console.log(`https://mysite.wixanswers.com/api/v1/accounts/callback/sso?redirectUrl=https%3A%2F%2Fmysite.wixanswers.com%2Fen&token=${token}&key=${KEY_ID}`);
由于我的项目是一个概念,我没有与真正的身份服务器集成,如您所见,我跳过了身份验证并直接进入授权(对于我的硬编码用户:Homer Simpson(。为了使其工作,我需要添加身份验证并将动态用户对象传递给模块中的导出函数。
为了这个概念
:来自外壳"节点加密.js" 在控制台中返回重定向 URL - 跟随时,使用正确的用户对象成功登录到 Wix Answers 平台。