代码之家  ›  专栏  ›  技术社区  ›  Rishav Sharan

如何让Foxx服务使用基集合而不是安装特定的集合

  •  1
  • Rishav Sharan  · 技术社区  · 6 年前

    如何让Foxx服务使用基本集合进行身份验证操作?例如,我希望在 https://docs.arangodb.com/3.3/Manual/Foxx/Users.html 要使用集合“用户”和“会话”,而不是“测试用户”和“测试会话”,其中“测试”是我的装入点的名称。

    我想运行多个服务,所有这些服务都使用同一个基集合。但是如果我使用教程中给出的内容,我最终会得到一个特定于某个服务的授权集合和路由,这对我来说男性没有多大意义。

    我的StupU.js是;

    'use strict';
    const db = require('@arangodb').db;
    const sessions = module.context.collectionName('sessions');
    const users = module.context.collectionName('users');
    
    if (!db._collection(sessions)) {
      db._createDocumentCollection(sessions);
    }
    
    if (!db._collection(users)) {
      db._createDocumentCollection(users);
    }
    
    db._collection(users).ensureIndex({
      type: 'hash',
      fields: ['username'],
      unique: true
    });
    

    我的index.js是;

    'use strict';
    
    const joi = require('joi');
    const createAuth = require('@arangodb/foxx/auth');
    const createRouter = require('@arangodb/foxx/router');
    const sessionsMiddleware = require('@arangodb/foxx/sessions');
    // const db = require('@arangodb').db;
    
    const auth = createAuth();
    const router = createRouter();
    const users = db._collection('users');
    const sessions = sessionsMiddleware({
    storage: module.context.collection('sessions'),
    transport: 'cookie'
    });
    
    module.context.use(sessions);
    module.context.use(router);
    
    // continued
    router.post('/signup', function (req, res) {
        const user = {};
        try {
          user.authData = auth.create(req.body.password);
          user.username = req.body.username;
          user.perms = [];
          const meta = users.save(user);
          Object.assign(user, meta);
        } catch (e) {
          // Failed to save the user
          // We'll assume the uniqueness constraint has been violated
          res.throw('bad request', 'Username already taken', e);
        }
        req.session.uid = user._key;
        req.sessionStorage.save(req.session);
        res.send({success: true});
      })
      .body(joi.object({
        username: joi.string().required(),
        password: joi.string().required()
      }).required(), 'Credentials')
      .description('Creates a new user and logs them in.');
    

    我试着用 const users = db._collection('users'); 而不是 const users = module.context.collection('users'); 但这会引发自大的API错误。

    1 回复  |  直到 6 年前
        1
  •  2
  •   sevcik.tk    6 年前

    要实现这一点,您需要更改集合名称的分配 module.context.collectionName('nameOfCollection') 'nameOfCollection' 在所有文件中,因为 module.context.collectionName 在字符串前面加上服务名

    所以

    J.

    const sessions = 'sessions';
    const users = 'users';
    

    索引文件

    const users = db._collection('users');
    const sessions = sessionsMiddleware({
        storage: 'sessions',
        transport: 'cookie'
    });
    

    但是,当更多的服务需要访问同一基础集合(例如,一个服务的拆卸可以删除其他服务的集合)时,这种方法是反模式的。

    在这种情况下,你应该利用 dependencies 只有您的身份验证服务才有权访问自己的集合,其他服务应该有身份验证服务作为依赖项,并通过身份验证服务访问身份验证数据。

    认证服务需要

    在manifest.json中

    "provides": {
        "myauth": "1.0.0"
    }
    

    在index.js或您指向的文件中 main 在manifest.json中

    module.exports = {
        isAuthorized (id) {
            return false; // your code for validating if user is authorized
        }
    };
    

    消费服务需要有

    在manifest.json中

    "dependencies": {
        "myauth": {
            "name": "myauth",
            "version": "^1.0.0",
            "description": "Auth service.",
            "required": true
        }
    }
    

    然后你就可以注册并调用它

    const myauth = module.context.dependencies.myauth;
    if (myauth.isAuthorized()) {
        // your code
    } else {
        res.throw(401);
    }
    

    有关请求授权的进一步步骤,请检查如何使用 Middleware Session middleware

    神速