如何将 Wix Answers 连接到我的 SSO 服务器

How to connect Wix Answers to my SSO server

我临时做了一个 'sso server',我想将其连接到 Wix Answers。 Wix 是一个 CMS。 Wix Answers 是一个帮助中心,您可以在其中提供客户常见问题解答、让客户接收支持视频以及客户可以输入工单。 Wix 答案是 Wix 用于 Wix 帮助页面的内容,它们使用户可以出于相同目的使用相同的应用程序。

我的 'sso server' 是一个指向 Lambda 函数的 AWS API 网关。非常简单。您调用 public 端点,它运行此 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'));
}

此代码是此处 Wix Answers 示例 js 代码的 lambda 修改版本。 https://help.wixanswers.com/en/article/setting-up-single-sign-on-sso-for-your-users

存在依赖关系,我已经将它们全部加载到 lambda 中,所以它不是依赖关系问题。

Wix Answers 设置简单,您给他们一个 url 用于登录和注销。您在 Wix 答案仪表板中生成了一个密钥,我已将该密钥添加到下面的 lambda 中(下面的那些显然被屏蔽了)。我已将我的端点添加到 Wix 答案中的字段。

我收到了 null 响应,并且能够使用 object.message = "missing auth token"

获取对象

关注 JS 和 lambda,是否有任何我遗漏的东西会导致它不起作用。同样,在 express 和这些依赖项或 SSO 方面没有太多经验。

谢谢!!

Wix 有一些很好的工具,但有时缺少文档。这是我解决这个问题的方法:

教程https://help.wixanswers.com/en/article/setting-up-single-sign-on-sso-for-your-users

他们的 JS 代码来自 https://gist.github.com/GabiGrin/0c92ecbb071e02e2d91c8d689517acd7#file-answers-sso-example-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)。要使其正常工作,我需要添加身份验证并将动态用户对象传递给模块中的导出函数。

为了概念的缘故:

来自 shell 'node encrypt.js' returns 控制台中的重定向 URL - 执行后,使用正确的用户对象成功将您登录到 Wix Answers 平台。