MongoDB Stitch REST API-有效负载签名验证

时间:2018-11-20 15:50:10

标签: mongodb rest api mongodb-stitch

我正在开发SANDBOX集群和我在MongoDB Stitch中创建的新应用。

我需要了解MongoDB Stitch App中的“有效负载签名验证”。可以说,我需要创建一个REST GET API,它将获取我的产品列表,但是此API调用必须经过身份验证。只有注册/认证的用户才能拨打此电话。 MongoDB Stitch建议如下:

https://docs.mongodb.com/stitch/services/webhook-requests-and-responses/#webhook-verify-payload-signature

但是,我需要了解:

image1

(1)在何处添加此身体和秘密?据我所知,它必须保存在缝制应用程序中,因为您不得在客户端javascript中公开任何秘密密钥。

(2){“ message”:“ MESSAGE”}这是可配置的吗?如果是,我们应该在此处添加什么值?

image2

此功能必须在MongoDB Stitch App中进行编码。很清楚此函数根据您在上一步中传递的“ body”和“ secret”返回“ hash”。

现在,您必须在API请求中传递此哈希值:

image3

现在,问题是:

您可以轻松地在开发人员工具中看到正在传递给服务器的任何请求,任何人都可以轻松复制并通过POSTMAN传递给服务器。所以:

->如何保护我的请求? (仅供参考:我还添加了“规则”,表示只有在域名包含例如www.mysite.com的情况下,此请求才必须执行。但是我能够从本地主机成功执行该请求。)

->如果可以,任何人都可以将我的请求复制并粘贴到POSTMAN中并运行它。那么,生成该HASH有什么用?

->如何在有限的时间内保持我的请求令牌有效/有效,可以说请求仅在接下来的5分钟内有效? (我是说我该如何在Stitch APP中执行此操作?该选项在哪里?)

->如何获得刷新令牌? &即使我以某种方式得到它,如何将其重新传递给请求?

在MongoDB Stich文档中,所有此类查询都是UN_ANSWERED:https://docs.mongodb.com/stitch/

基本上,我想了解MongoDB Stitch App / Stitch REST API的任何GET / POST / PUT / PATCH / DELETE请求的完整生命周期。

如果有人使用过MongoDB Stich,请向我解释。

1 个答案:

答案 0 :(得分:0)

我不知道您的特定用例,尽管在创建Authenticated HTTP REST API时也遇到了问题。我的想法是:我已经有了Stitch中定义的所有安全规则和架构,现在我想仍然使用Stitch中定义的逻辑通过HTTP访问数据,而不是重写所有内容。

我无法使用Stitch函数和Webhooks创建这样的API,尽管我用NodeJS Koa(express或任何其他框架都可以)和{{3 }}:

// app.js
const Koa = require('koa')
const app = module.exports = new Koa()

const auth = require('./auth')
const router = require('./router')

app.use(auth())
app.use(router.routes())
app.use(router.allowedMethods())

// listen
if (!module.parent) {
  app.listen(3000)
}
// auth.js
const { loginWithApiKey } = require('./stitch')

function auth () {
  return async function auth (ctx, next) {
    const apiKey = ctx.query.api_key

    try {
      await loginWithApiKey(apiKey)
    } catch (e) {
      ctx.throw(401, 'Not Authorized')
    }

    await next()
  }
}

module.exports = auth
// router.js
const router = require('koa-router')()
const { BSON } = require('mongodb-stitch-server-sdk')

const { db } = require('./stitch')

router.get('/', async (ctx) => {
  ctx.body = { message: 'Nothing to see, but you\'re good!' }
})

const COLLECTIONS_WHITELIST = [
  'activities',
  'expenses',
  'projects',
  'resources'
]

// List
router.get('/:collection', async (ctx) => {
  const collection = ctx.params.collection

  isValidCollection(ctx, collection)

  ctx.body = await db
    .collection(collection)
    .find()
    .toArray()
})

function isValidCollection (ctx, collection) {
  // check if the collection is allowed in the API
  if (!COLLECTIONS_WHITELIST.includes(collection)) {
    ctx.throw(404, `Unknown API entity ${collection}`)
  }
}

module.exports = router

我希望对您有帮助