authentication-service icon indicating copy to clipboard operation
authentication-service copied to clipboard

Allow using authentication service as a library

Open chadfurman opened this issue 6 years ago • 4 comments

I'd like to pull in the backend and front-end js components separately. I have a GraphQL API and would like to write resolvers that use this service.

What do you think of making a monorepo (pnp-authentication) made up of the following packages:

  • [ ] pnp-authentication-users - package that provides tools for authentication, account creation, and generating password reset tokens
    • emits events like "userRegistering", "userRegistered", "loginFailed", "resetTokenGenerated", ...
  • [ ] pnp-authentication-email - a basic send-receive email package configured through the standard environment variables
    • "emailSendSuccess", "emailSendFailure", ...
  • [ ] pnp-authentication-jwt - a package for creating and verifying JWTs
    • events could be used for implementing a JWT caching system
  • [ ] pnp-authentication-avatar (image uploading, adding avatar data to schema)
    • default configuration to be compatible with existing schema expectations
  • [ ] pnp-authentication-recaptcha - utilities to add and verify a recaptcha
  • [ ] pnp-authentication-templates - Registers functions for generating templates
    • comes with the current set of template files

pnp-autnentication should allow for overiding any of these packages -- there should be a set API that these packages use to communicate, as well as a configure option when initializing the library to override any of the default API with a custom implementation.

Here is one theoretical way we could make this more of a configurable library while still staying true to the plug-and-play nature of the whole thing:

const authService = pnpAuthentication({
  jwt: {
    signJwt: function implementsJwtPackageApiForSignJwt(...) { ... },
    // other functions not mentioned here use the default from the package
  },
  templates: {
    login: renderLoginFuncion; // renderLoginFunction gets passed any config data needed to render the login page, and returns the complete HTML (CSS, JS, etc) necessary to render this view
  }
})

chadfurman avatar Sep 24 '17 22:09 chadfurman