我已经制作了trapi API,但是trapi为用户角色提供了身份验证。
我想为有效的API密钥(例如流行的API)提供身份验证。
请帮忙。
答案 0 :(得分:1)
此功能在我们的待办事项列表中! https://portal.productboard.com/strapi/1-public-roadmap/c/40-api-access-token-with-permissions
因此,我的答案是定制以帮助您拥有此功能。当我们发布该功能时,它将不再有用。
我们将使用一种方法,但重要的是我将使用的概念。
首先,您必须了解自定义概念https://strapi.io/documentation/3.0.0-beta.x/concepts/customization.html
然后,要管理令牌,您将必须创建具有2个属性的Token
内容类型。
完成后,您将必须创建一个新条目(令牌和用户)并将它们链接在一起。
此后,我们将更新Strapi管理JWT的方式,以便能够管理将包含我们的?token=my-token
令牌查询参数的URL。
这是管理Strapi权限的文件。我们将不得不对其进行自定义。 https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-users-permissions/config/policies/permissions.js
因此,创建一个./extensions/users-permissions/config/policies/permissions.js
文件,并将原始代码复制到您刚刚创建的文件中。
之后,您将必须自定义功能。
使用以下代码,我们可以管理Authorization标头和Token查询参数。
它将应用令牌相关用户的权限。
const _ = require('lodash');
module.exports = async (ctx, next) => {
let role;
if (
(ctx.request && ctx.request.header && ctx.request.header.authorization) ||
(ctx.request.query && ctx.request.query.token)
) {
try {
let id;
let isAdmin;
if (ctx.request.query && ctx.request.query.token) {
const [token] = await strapi.query('token').find({token: ctx.request.query.token})
id = token.user.id;
isAdmin = false;
delete ctx.request.query.token;
} else if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
const decrypted = await strapi.plugins[
'users-permissions'
].services.jwt.getToken(ctx);
id = decrypted.id;
isAdmin = decrypted.isAdmin || false;
}
if (id === undefined) {
throw new Error('Invalid token: Token did not contain required fields');
}
答案 1 :(得分:0)
只需添加Jim的代码即可更好地处理错误:
const _ = require('lodash');
module.exports = async (ctx, next) => {
let role;
if (
(ctx.request && ctx.request.header && ctx.request.header.authorization) ||
(ctx.request.query && ctx.request.query.token)
) {
try {
let id;
let isAdmin;
if (ctx.request.query && ctx.request.query.token) {
const [token] = await strapi.query('authtoken').find({token: ctx.request.query.token});
if (!token) {
return handleErrors(ctx, 'Your token is not valid', 'unauthorized');
} else {
if (token.user && typeof token.token === 'string') {
id = token.user.id;
}
isAdmin = false;
}
delete ctx.request.query.token;
} else if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
const decrypted = await strapi.plugins[
'users-permissions'
].services.jwt.getToken(ctx);
id = decrypted.id;
isAdmin = decrypted.isAdmin || false;
}
if (id === undefined) {
throw new Error('Invalid token: Token did not contain required fields');
}
```