将产品Api密钥添加到Strapi作为产品

时间:2019-11-23 05:56:28

标签: strapi

我已经制作了trapi API,但是trapi为用户角色提供了身份验证
我想为有效的API密钥(例如流行的API)提供身份验证。
请帮忙。

2 个答案:

答案 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内容类型。

  • 令牌:将是一个字符串
  • 用户:与用户的关系为1:1。

完成后,您将必须创建一个新条目(令牌和用户)并将它们链接在一起。

此后,我们将更新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');
      }
    ```