Как подключить ответы Wix к моему SSO-серверу - PullRequest
1 голос
/ 06 февраля 2020

Я сделал временный 'sso-сервер', который я хочу подключить к Ответам Wix. Wix это CMS. Wix Answers - это справочный центр, где вы можете получить ответы на часто задаваемые вопросы, получить от клиентов видео поддержки, а также ввести билеты. Ответы Wix - это то, что Wix использует для страниц справки Wix, и они делают одно и то же приложение доступным для пользователей с той же целью.

Мой 'сервер sso' - это AWS API-шлюз, указывающий на функцию Lambda. Довольно прямо вперед. Вы вызываете оконечную точку publi c, и она запускает следующую лямбду:

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 js, отсюда. https://help.wixanswers.com/en/article/setting-up-single-sign-on-sso-for-your-users

Есть зависимости, и я загрузил их все в лямбду, так что это не проблема зависимостей.

Wix Ответы - это простая установка, вы дать им URL для входа и выхода. вы генерируете ключ внутри панели инструментов ответов Wix, и я добавил этот ключ в свою лямбду ниже (те, что ниже, явно замаскированы). Я добавил свою конечную точку в поле в ответах wix.

Я получаю ответ null и смог получить объект с object.message = "missing auth token"

Фокусировка на JS и лямбде, есть ли что-то, что я оставляю, чтобы это не сработало. Опять же, не очень много опыта с express и этими зависимостями или с SSO.

Спасибо !!

1 Ответ

0 голосов
/ 10 февраля 2020

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}`);

Поскольку мой проект является концепцией, я не интегрировался с реальным сервером идентификации, как вы можете видеть, я пропускаю аутентификацию и go право на авторизацию (для моего пользователя с жестким кодом: Гомер Симпсон). Чтобы это работало, мне нужно было добавить аутентификацию и передать динамический c пользовательский объект в функцию экспорта в модуле.

ради концепции tho:

из Оболочка 'node encrypt. js' возвращает URL-адрес перенаправления в консоли - после этого успешно регистрирует вас на платформе Wix answers с соответствующим пользовательским объектом.

...