React+AWS Cognito教程八:在后台对Cognito Id Token进行验证


前面已经介绍了如何在前台的React中进行用户注册和登录。一旦用户登录,就会获得Id Token, Access Token, Refresh Token。然后可以将这些Token保存在一个Session中。在向后台发出API请求的时候,可以把token放在请求的header中。那么,问题就来了,在后台如何验证Token,并根据token授权呢?

假定你在发出请求的时候将Id Token放在请求头中了。下面介绍的是如何在后台,比如一个API Endpoint中对请求进行验证和授权。

安装需要的包

bash
yarn add jwt-decode verify-cognito-token

验证token的合法性

JavaScript
const Verifier = require('verify-cognito-token');

const verifyToken = token => {
  const awsRegion = 'eu-west-1';
  const cognitoUserPool = 'eu-west-1_xxxxxxxxxxxxxx';
  const cognitoClientId = '5ppXXXXXXXXXXXXXXXXXXXXX';
  const validUntilTimeStamp = new Date().getTime() + 100 * 60 * 1000; // token should be available within next 10 minutes

  // params
  const params = {
    region: awsRegion, // required
    userPoolId: cognitoUserPool, // required
    debug: true, // optional parameter to show console logs
  };

  // optional claims examples
  const claims = {
    aud: cognitoClientId,
    email_verified: true,
    auth_time: time => time <= validUntilTimeStamp,
    // 'cognito:groups': groups => groups.includes('Admins'),
  };

  const verifier = new Verifier(params, claims);
  verifier.verify(token).then(result => {
    console.log(result);
    // result will be `true` if token is valid, non-expired, and has matching claims
    // result will be `false` if token is invalid, expired or fails the claims check
  });
};

通过这一步,能够保证所收到的token是从指定的Cognito User Pool中创建的,并使用指定的Cognito Client ID创建的。这样就能确保token的合法性。

从Token中提取用户信息

通过上一步,我们能够确认Id Tokne的合法性,接下来就可以获取对应的用户信息,然后根据用户id/email来查找用户所属的组,并赋予对应的权限了。当然,也可以在定义Cognito User Pool的时候,同时定义用户角色,这样在解析token后就能直接得到用户的角色了。

JavaScript
const jwt_decode = require('jwt-decode');

const decoded = jwt_decode(token);
console.log('decoded', decoded);

const { email } = decoded;
console.log('email', email);

下面的授权处理就比较灵活了,比如,定义不同的组,看看用户在哪个组中,然后就知道用户能做什么了。


文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !