我正在开发SANDBOX集群和我在MongoDB Stitch中创建的新应用。
我需要了解MongoDB Stitch App中的“有效负载签名验证”。可以说,我需要创建一个REST GET API,它将获取我的产品列表,但是此API调用必须经过身份验证。只有注册/认证的用户才能拨打此电话。 MongoDB Stitch建议如下:
但是,我需要了解:
(1)在何处添加此身体和秘密?据我所知,它必须保存在缝制应用程序中,因为您不得在客户端javascript中公开任何秘密密钥。
(2){“ message”:“ MESSAGE”}这是可配置的吗?如果是,我们应该在此处添加什么值?
此功能必须在MongoDB Stitch App中进行编码。很清楚此函数根据您在上一步中传递的“ body”和“ secret”返回“ hash”。
现在,您必须在API请求中传递此哈希值:
现在,问题是:
您可以轻松地在开发人员工具中看到正在传递给服务器的任何请求,任何人都可以轻松复制并通过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,请向我解释。
答案 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
我希望对您有帮助