Ограничить доступ к конечным точкам RPC

Интересно, предоставляет ли Deepstream готовое к использованию решение, чтобы сделать конечные точки частными / общедоступными. Если мне не интересно, как я могу отслеживать правильные глубокие вызовы на стороне сервера, чтобы разрешить только определенные конечные точки? Я считаю, что мне нужен провайдер allowHandler, который реализует canPerformAction, и проверил, требуется ли авторизация вызова RPC и правильно ли авторизован вызывающий для этого. Это правильное мышление? Я просматриваю документацию и понимаю, что меня интересует тема P, но я не знаю, что нужно проверить. https://deepstream.io/docs/constants.html

Заранее спасибо!

1 ответ

Решение

Вы на подходе. Вот пример кода о том, как разрешить разных пользователей для разных RPC. В реальном случае использования вы, скорее всего, получите переменные users а также rpcs из базы данных.

Так что теперь, когда клиент звонит ds.rpc.make( 'set-user-data',... сервер ищет, какое разрешение требует rpc ('canEditUser') и если у пользователя есть такое разрешение (mike: true, lisa: false)

var DeepstreamServer = require( 'deepstream.io' );
var server = new DeepstreamServer();
var C = server.constants;
var users = {
    'mike': { canEditUser: true },
    'lisa': { canEditUser: false }
};
var rpcs = {
    'set-user-data': 'canEditUser'
};

server.set( 'permissionHandler', {
    isValidUser: function( connectionData, authData, callback ) {
        if( !authData.username ) {
            callback( 'no username specified' );
        }
        else if( users[ authData.username ] ) {
            callback( null, authData.username );
        }
    },
    canPerformAction: function( username, message, callback ) {
        var isIncomingRpc = message.topic === C.TOPIC.RPC && message.action === C.ACTIONS.REQUEST;

        if( isIncomingRpc ) {
            var rpcName = message.data[ 0 ];

            if( rpcs[ rpcName ] === undefined ) {
                callback( 'Unknown RPC ' + rpcName );
                return;
            }

            var userPermissions = users[ username ];
            var requiredRpcPermissions = rpcs[ rpcName ];
            var isPermissioned = userPermissions[ requiredRpcPermissions ];

            callback( null, isPermissioned );

        }
    }
});

server.start();
Другие вопросы по тегам