首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用调用postgraphile的节点js验证密钥披风令牌?

如何使用调用postgraphile的节点js验证密钥披风令牌?
EN

Stack Overflow用户
提问于 2021-11-30 16:06:28
回答 1查看 2.6K关注 0票数 1

我是节点js的新手,我为之工作的公司需要一个有关postgraphile概念的证明,情况如下:

  1. I创建了一个节点js迷你服务器,该服务器使用postgraphile访问postgres
  2. 上的数据。迷你服务器工作正常,可以返回数据,也可以使用突变。
  3. i使用keycloak-connect尝试从邮递员发送的请求中访问密钥披风来验证令牌,但存在一个问题。
  4. 如果令牌有效与否对迷你服务器无关紧要,唯一重要的似乎是承载令牌。

我尝试使用其他插件(如keycloak-nodejs-connect、keycloak-验证等),但结果是一样的,我也修改了代码,使用这些插件的文档中的示例,但没有使用。

这是我的代码:(keycloak-config.js文件)

代码语言:javascript
复制
var session = require('express-session');
var Keycloak = require('keycloak-connect');

let _keycloak;

var keycloakConfig = {
    clientId: 'type credential',
    bearerOnly: true,
    serverUrl: 'our company server',
    realm: 'the test realm',
    grantType: "client_credentials",
    credentials: {
        secret: 'our secret'
    }
};

function initKeycloak(){
    if(_keycloak){
        console.warn("Trying to init Keycloak again!");
        return _keycloak;
    }
    else{
        console.log("Initializing Keycloak...");
        var memoryStore = new session.MemoryStore();
        _keycloak = new Keycloak({store: memoryStore}, keycloakConfig);

        return _keycloak;
    }
}

function getKeycloak(){
    if(!_keycloak){
        console.error('Keycloak has not been initialized. Please called init first');
    }

    return _keycloak;
}

module.exports = {
    initKeycloak,
    getKeycloak
};

我的Index.js文件:

代码语言:javascript
复制
const express = require('express')
const bodyParser = require('body-parser')
const postgraphile = require('./postgraphile')
const app = express()

const keycloak = require('../config/keycloak-config').initKeycloak()

var router = express.Router();

app.set( 'trust proxy', true );
app.use(keycloak.middleware());
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(postgraphile);

app.get('/', keycloak.checkSso(), (req, res) => {
    res.send('success');
    } );

var server = app.listen(8080, () => console.log(`Server running on port ${8080}`));

此外,我还使用了以下代码来获取令牌,并使用keycloak验证插件,但一无所获:

代码语言:javascript
复制
router.get('/',keycloak.protect(),function(req, res, next) {
    var token=req.headers['authorization'];
    console.log(token);

    try {
        let user = keycloak.jwt.verify(token);
        console.log(user.isExpired());
    } catch (error) {
        console.error(error);
    }
})

我知道我缺乏这方面的知识,因为我是后端(C#)开发人员,有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-17 13:33:57

我找到了我的问题的答案:

代码语言:javascript
复制
const express = require("express");
const request = require("request");
var keycloakConfig = require('../AuthOnly/config/keycloak-config').keycloakConfig;
const postgraphile = require('./postgraphile');

const app = express();

const keycloakHost = keycloakConfig.serverUrl;
const realmName = keycloakConfig.realm;

// check each request for a valid bearer token
app.use((req, res, next) => {
  // assumes bearer token is passed as an authorization header
  if (req.headers.authorization) {
    // configure the request to your keycloak server
    const options = {
      method: 'GET',
      url: `${keycloakHost}/auth/realms/${realmName}/protocol/openid-connect/userinfo`,
      headers: {
        // add the token you received to the userinfo request, sent to keycloak
        Authorization: req.headers.authorization,
      },
    };

    // send a request to the userinfo endpoint on keycloak
    request(options, (error, response, body) => {
      if (error) throw new Error(error);

      // if the request status isn't "OK", the token is invalid
      if (response.statusCode !== 200) {
        res.status(401).json({
          error: `unauthorized`,
        });
      }
      // the token is valid pass request onto your next function
      else {
        next();
      }
    });
  } else {
    // there is no token, don't process request further
    res.status(401).json({
    error: `unauthorized`,
  });
}});

app.use(postgraphile);

app.listen(8080);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70172435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档