Marshall Thompson ae85fa216f
feat(docs): New website and documentation pages (#2802)
* feat(docs) new docs site started

* Minor page edits

* feat(footer) fix spacing

* empty guides template

Co-authored-by: daffl <daff@neyeon.com>
2022-10-17 13:05:01 -06:00

2.8 KiB

outline
deep

Anonymous authentication

Anonymous authentication can be allowed by creating a custom strategy that returns the params that you would like to use to identify an authenticated user.

import { Params } from '@feathersjs/feathers';
import { AuthenticationBaseStrategy, AuthenticationResult, AuthenticationService } from '@feathersjs/authentication';

class AnonymousStrategy extends AuthenticationBaseStrategy {
  async authenticate(authentication: AuthenticationResult, params: Params) {
    return {
      anonymous: true
    }
  }
}

export default function(app: Application) {
  const authentication = new AuthenticationService(app);
  // ... authentication service setup
  authentication.register('anonymous', new AnonymousStrategy());
}

In src/authentication.js:

const { AuthenticationBaseStrategy, AuthenticationService } = require('@feathersjs/authentication');

class AnonymousStrategy extends AuthenticationBaseStrategy {
  async authenticate(authentication, params) {
    return {
      anonymous: true
    }
  }
}

module.exports = app => {
  const authentication = new AuthenticationService(app);
  // ... authentication service setup
  authentication.register('anonymous', new AnonymousStrategy());
}

Next, we create a hook called allow-anonymous that sets params.authentication if it does not exist and if params.provider exists (which means it is an external call) to use that anonymous strategy:

import { Hook, HookContext } from '@feathersjs/feathers';

export default (): Hook => {
  return async (context: HookContext) => {
    const { params } = context;

    if(params.provider && !params.authentication) {
      context.params = {
        ...params,
        authentication: {
          strategy: 'anonymous'
        }
      }
    }

    return context;
  }
}
/* eslint-disable require-atomic-updates */
module.exports = function (options = {}) { // eslint-disable-line no-unused-vars
  return async context => {
    const { params } = context;

    if(params.provider && !params.authentication) {
      context.params = {
        ...params,
        authentication: {
          strategy: 'anonymous'
        }
      }
    }

    return context;
  };
};

This hook should be added before the authenticate hook wherever anonymous authentication should be allowed:

all: [ allowAnonymous(), authenticate('jwt', 'anonymous') ],

If an anonymous user now accesses the service externally, the service call will succeed and have params.anonymous set to true.