mirror of
https://github.com/volatiletech/authboss.git
synced 2025-09-16 09:06:20 +02:00
Touch up documentation for v2
This commit is contained in:
303
README.md
303
README.md
@@ -3,6 +3,7 @@
|
||||
<!-- TOC -->
|
||||
|
||||
- [Authboss](#authboss)
|
||||
- [New to v2?](#new-to-v2)
|
||||
- [Why use Authboss?](#why-use-authboss)
|
||||
- [Getting Started](#getting-started)
|
||||
- [App Requirements](#app-requirements)
|
||||
@@ -34,6 +35,19 @@
|
||||
- [Remember Me](#remember-me)
|
||||
- [Locking Users](#locking-users)
|
||||
- [Expiring User Sessions](#expiring-user-sessions)
|
||||
- [One Time Passwords](#one-time-passwords)
|
||||
- [Two Factor Authentication](#two-factor-authentication)
|
||||
- [Two-Factor Recovery](#two-factor-recovery)
|
||||
- [Time-Based One Time Passwords 2FA (totp)](#time-based-one-time-passwords-2fa-totp)
|
||||
- [Adding 2fa to a user](#adding-2fa-to-a-user)
|
||||
- [Removing 2fa from a user](#removing-2fa-from-a-user)
|
||||
- [Logging in with 2fa](#logging-in-with-2fa)
|
||||
- [Using Recovery Codes](#using-recovery-codes)
|
||||
- [Text Message 2FA (sms)](#text-message-2fa-sms)
|
||||
- [Adding 2fa to a user](#adding-2fa-to-a-user-1)
|
||||
- [Removing 2fa from a user](#removing-2fa-from-a-user-1)
|
||||
- [Logging in with 2fa](#logging-in-with-2fa-1)
|
||||
- [Using Recovery Codes](#using-recovery-codes-1)
|
||||
- [Rendering Views](#rendering-views)
|
||||
- [HTML Views](#html-views)
|
||||
- [JSON Views](#json-views)
|
||||
@@ -55,6 +69,11 @@ to websites in general so that you can enable as many as you need, and leave the
|
||||
It makes it easy to plug in authentication to an application and get a lot of functionality
|
||||
for (hopefully) a smaller amount of integration effort.
|
||||
|
||||
# New to v2?
|
||||
|
||||
v1 -> v2 was a very big change. If you're looking to upgrade there is a general guide in
|
||||
[tov2.md](tov2.md) in this project.
|
||||
|
||||
# Why use Authboss?
|
||||
|
||||
Every time you'd like to start a new web project, you really want to get to the heart of what you're
|
||||
@@ -62,8 +81,8 @@ trying to accomplish very quickly and it would be a sure bet to say one of the s
|
||||
about implementing and innovating on is not authentication. In fact it's very much the opposite: it's
|
||||
one of those things that you have to do and one of those things you loathe to do. Authboss is supposed
|
||||
to remove a lot of the tedium that comes with this, as well as a lot of the chances to make mistakes.
|
||||
This allows you to care about what you're intending to do, rather than on ancillary support systems
|
||||
to make it happen.
|
||||
This allows you to care about what you're intending to do, rather than care about ancillary support
|
||||
systems required to make what you're intending to do happen.
|
||||
|
||||
Here are a few bullet point reasons you might like to try it out:
|
||||
|
||||
@@ -115,7 +134,6 @@ if err := ab.Init(); err != nil {
|
||||
// mux in this example is a chi router, but it could be anything that can route to
|
||||
// the Core.Router.
|
||||
mux.Mount("/authboss", http.StripPrefix("/authboss", ab.Config.Core.Router))
|
||||
|
||||
```
|
||||
|
||||
For a more in-depth look you **definitely should** look at the authboss sample to see what a full
|
||||
@@ -153,17 +171,19 @@ all to function properly, please see [Middlewares](#middlewares) for more inform
|
||||
|
||||
### Configuration
|
||||
|
||||
There are some required configuration variables that have no sane defaults:
|
||||
There are some required configuration variables that have no sane defaults and are particular
|
||||
to your app:
|
||||
|
||||
* Config.Paths.Mount
|
||||
* Config.Paths.RootURL
|
||||
|
||||
### Storage and Core implementations
|
||||
|
||||
Everything under Config.Storage and Config.Core are required. however you can optionally use default
|
||||
implementations from the [defaults package](https://github.com/volatiletech/authboss/defaults).
|
||||
Everything under Config.Storage and Config.Core are required and you must provide them,
|
||||
however you can optionally use default implementations from the
|
||||
[defaults package](https://github.com/volatiletech/authboss/defaults).
|
||||
This also provides an easy way to share implementations of certain stack pieces (like HTML Form Parsing).
|
||||
As you see in the example above these can be easily initialized with the `SetCore` method in that
|
||||
As you saw in the example above these can be easily initialized with the `SetCore` method in that
|
||||
package.
|
||||
|
||||
The following is a list of storage interfaces, they must be provided by the implementer. Server is a
|
||||
@@ -171,7 +191,7 @@ very involved implementation, please see the additional documentation below for
|
||||
|
||||
* Config.Storage.Server
|
||||
* Config.Storage.SessionState
|
||||
* Config.Storage.CookieState (only for remember me)
|
||||
* Config.Storage.CookieState (only for "remember me" functionality)
|
||||
|
||||
The following is a list of the core pieces, these typically are abstracting the HTTP stack.
|
||||
Out of all of these you'll probably be mostly okay with the default implementations in the
|
||||
@@ -208,7 +228,7 @@ interface is a flexible notion, because it can be upgraded to suit the needs of
|
||||
|
||||
Initially the User must only be able to Get/Set a `PID` or primary identifier. This allows the authboss
|
||||
modules to know how to refer to him in the database. The `ServerStorer` also makes use of this
|
||||
to save/retrieve users.
|
||||
to save/load users.
|
||||
|
||||
As mentioned, it can be upgraded, for example suppose now we want to use the `confirm` module,
|
||||
in that case the e-mail address now becomes a requirement. So the `confirm` module will attempt
|
||||
@@ -228,9 +248,15 @@ interface in the Config returns
|
||||
which can be validated. But much like the storer and user it can be upgraded to add different
|
||||
capabilities.
|
||||
|
||||
Typically the way this will look as an implementation is to check the page being requested, switch on that to parse the body in whatever way (msgpack, json, url-encoded, doesn't matter), and produce
|
||||
a struct that has the ability to `Validate` it's data as well as functions to retrieve the data
|
||||
necessary for the particular valuer required by the module.
|
||||
A typical `BodyReader` (like the one in the defaults package) implementation checks the page being
|
||||
requested and switches on that to parse the body in whatever way
|
||||
(msgpack, json, url-encoded, doesn't matter), and produce a struct that has the ability to
|
||||
`Validate()` it's data as well as functions to retrieve the data necessary for the particular
|
||||
valuer required by the module.
|
||||
|
||||
An example of an upgraded `Valuer` is the
|
||||
[UserValuer](https://godoc.org//github.com/volatiletech/authboss/#UserValuer)
|
||||
which stores and validates the PID and Password that a user has provided for the modules to use.
|
||||
|
||||
Your body reader implementation does not need to implement all valuer types unless you're
|
||||
using a module that requires it. See the [Use Cases](#use-cases) documentation to know what the
|
||||
@@ -247,8 +273,9 @@ documentation below, it will make much more sense.
|
||||
### Paths
|
||||
|
||||
Paths are the paths that should be redirected to or used in whatever circumstance they describe.
|
||||
Two special paths that are required are `Mount` and `RootURL`, without which certain authboss
|
||||
modules will not function correctly.
|
||||
Two special paths that are required are `Mount` and `RootURL` without which certain authboss
|
||||
modules will not function correctly. Most paths get defaulted to `/` such as after login success
|
||||
or when a user is locked out of their account.
|
||||
|
||||
### Modules
|
||||
|
||||
@@ -271,7 +298,7 @@ about what these are.
|
||||
These are the implementations of the HTTP stack for your app. How do responses render? How are
|
||||
they redirected? How are errors handled?
|
||||
|
||||
For most of these there are default implementations implementations from the
|
||||
For most of these there are default implementations from the
|
||||
[defaults package](https://github.com/volatiletech/authboss/defaults) available, but not for all.
|
||||
See the package documentation for more information about what's available.
|
||||
|
||||
@@ -281,6 +308,9 @@ Each module can be turned on simply by importing it and the side-effects take ca
|
||||
Not all the capabilities of authboss are represented by a module, see [Use Cases](#use-cases)
|
||||
to view the supported use cases as well as how to use them in your app.
|
||||
|
||||
**Note**: The two factor packages do not enable via side-effect import, see their documentation
|
||||
for more information.
|
||||
|
||||
Name | Import Path | Description
|
||||
---------|-------------------------------------------|------------
|
||||
Auth | github.com/volatiletech/authboss/auth | Database password authentication for users.
|
||||
@@ -292,6 +322,10 @@ OAuth2 | github.com/volatiletech/authboss/oauth2 | Provides oauth2 authentic
|
||||
Recover | github.com/volatiletech/authboss/recover | Allows for password resets via e-mail.
|
||||
Register | github.com/volatiletech/authboss/register | User-initiated account creation.
|
||||
Remember | github.com/volatiletech/authboss/remember | Persisting login sessions past session cookie expiry.
|
||||
OTP | github.com/volatiletech/authboss/otp | One time passwords for use instead of passwords.
|
||||
Remember | github.com/volatiletech/authboss/otp/twofactor | Regenerate recovery codes for 2fa.
|
||||
Remember | github.com/volatiletech/authboss/otp/twofactor/totp2fa | Use Google authenticator-like things for a second auth factor.
|
||||
Remember | github.com/volatiletech/authboss/otp/twofactor/sms2fa | Use a phone for a second auth factor.
|
||||
|
||||
# Middlewares
|
||||
|
||||
@@ -308,6 +342,7 @@ use the middlewares if you use the module.
|
||||
|
||||
Name | Requirement | Description
|
||||
---- | ----------- | -----------
|
||||
[Middleware](https://godoc.org/github.com/volatiletech/authboss/#Middleware) | Recommended | Prevents unauthenticated users from accessing routes.
|
||||
[LoadClientStateMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.LoadClientStateMiddleware) | **Required** | Enables cookie and session handling
|
||||
[ModuleListMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.ModuleListMiddleware) | Optional | Inserts a loaded module list into the view data
|
||||
[confirm.Middleware](https://godoc.org/github.com/volatiletech/authboss/confirm/#Middleware) | Recommended with confirm | Ensures users are confirmed or rejects request
|
||||
@@ -339,7 +374,7 @@ Updating a user's password is non-trivial for several reasons:
|
||||
|
||||
In order to do this, we can use the
|
||||
[Authboss.UpdatePassword](https://godoc.org/github.com/volatiletech/authboss/#Authboss.UpdatePassword)
|
||||
method. This ensures the above facets are taken care of.
|
||||
method. This ensures the above facets are taken care of which the exception of the logging out part.
|
||||
|
||||
If it's also desirable to have the user logged out, please use the following methods to erase
|
||||
all known sessions and cookies from the user.
|
||||
@@ -365,6 +400,8 @@ Mailer | _None_
|
||||
To enable this side-effect import the auth module, and ensure that the requirements above are met.
|
||||
It's very likely that you'd also want to enable the logout module in addition to this.
|
||||
|
||||
Direct a user to `GET /login` to have them enter their credentials and log in.
|
||||
|
||||
## User Auth via OAuth2
|
||||
|
||||
| Info and Requirements | |
|
||||
@@ -414,17 +451,18 @@ themselves, which can be done using the confirm module.
|
||||
|
||||
The complicated part in implementing registrations are around the `RegisterPreserveFields`. This is to
|
||||
help in the case where a user fills out many fields, and then say enters a password
|
||||
which doesn't mean minimum requirements and it fails during validation. These preserve fields should
|
||||
which doesn't meet minimum requirements and it fails during validation. These preserve fields should
|
||||
stop the user from having to type in all that data again (it's a whitelist). This **must** be used
|
||||
in conjuction with `ArbitraryValuer` and although it's not a hard requirement `ArbitraryUser`
|
||||
should be used otherwise the arbitrary values cannot be stored in the database.
|
||||
|
||||
When the register module sees arbitrary data from an `ArbitraryValuer`, it loads the data key
|
||||
`authboss.DataPreserve = preserve` into the data for rendering registration failures.
|
||||
This means the values will be accessible in the templates by using `.preserve.field_name`.
|
||||
Preserve may be empty or nil so use `{{with ...}}` to make sure you don't have template errors.
|
||||
When the register module sees arbitrary data from an `ArbitraryValuer`, it sets the data key
|
||||
`authboss.DataPreserve` with a `map[string]string` in the data for when registration fails.
|
||||
This means the (whitelisted) values entered by the user previously will be accessible in the
|
||||
templates by using `.preserve.field_name`. Preserve may be empty or nil so use
|
||||
`{{with ...}}` to make sure you don't have template errors.
|
||||
|
||||
There is additional go documentation on the `RegisterPreserveFields` config option as well as
|
||||
There is additional Godoc documentation on the `RegisterPreserveFields` config option as well as
|
||||
the `ArbitraryUser` and `ArbitraryValuer` interfaces themselves.
|
||||
|
||||
## Confirming Registrations
|
||||
@@ -446,8 +484,8 @@ Confirming registrations via e-mail can be done with this module (whether or not
|
||||
module).
|
||||
|
||||
A hook on register kicks off the start of a confirmation which sends an e-mail with a token for the user.
|
||||
When the user re-visits the page, the `BodyReader` must read the token and return a type that can
|
||||
return the token.
|
||||
When the user re-visits the page, the `BodyReader` must read the token and return a type that returns
|
||||
the token.
|
||||
|
||||
Confirmations carry two values in the database to prevent a timing attack. The selector and the
|
||||
verifier, always make sure in the ConfirmingServerStorer you're searching by the selector and
|
||||
@@ -508,9 +546,11 @@ in most databases this will require a separate table, though you could implement
|
||||
or something as well.
|
||||
|
||||
A user who is logged in via Remember tokens is also considered "half-authed" which is a session
|
||||
key that you can query to check to see if a user should have full rights to more sensitive data,
|
||||
if they are half-authed and they want to change their user details for example you may want to
|
||||
force them to go to the login screen and put in their password to get a full auth first.
|
||||
key (`authboss.SessionHalfAuthKey`) that you can query to check to see if a user should have
|
||||
full rights to more sensitive data, if they are half-authed and they want to change their user
|
||||
details for example you may want to force them to go to the login screen and put in their
|
||||
password to get a full auth first. The `authboss.Middleware` has a boolean flag to `forceFullAuth`
|
||||
which prevents half-authed users from using that route.
|
||||
|
||||
## Locking Users
|
||||
|
||||
@@ -527,7 +567,7 @@ User | [LockableUser](https://godoc.org/github.com/volatiletech/authbos
|
||||
Values | _None_
|
||||
Mailer | _None_
|
||||
|
||||
Lock ensures that a user's account becomes locked if authentication (both auth and oauth2) are
|
||||
Lock ensures that a user's account becomes locked if authentication (both auth, oauth2, otp) are
|
||||
failed enough times.
|
||||
|
||||
The middleware protects resources from locked users, without it, there is no point to this module.
|
||||
@@ -551,9 +591,206 @@ Mailer | _None_
|
||||
Expire simply uses sessions to track when the last action of a user is, if that action is longer
|
||||
than configured then the session is deleted and the user removed from the request context.
|
||||
|
||||
This middleware should at a high level to ensure that "activity" is logged properly, as well as any
|
||||
middlewares down the chain do not attempt to do anything with the user before it's removed from the
|
||||
request context.
|
||||
This middleware should be inserted at a high level (closer to the request) in the middleware chain
|
||||
to ensure that "activity" is logged properly, as well as any middlewares down the chain do not
|
||||
attempt to do anything with the user before it's removed from the request context.
|
||||
|
||||
## One Time Passwords
|
||||
|
||||
| Info and Requirements | |
|
||||
| --------------------- | -------- |
|
||||
Module | otp
|
||||
Pages | otp, otpadd, otpclear
|
||||
Routes | /otp/login, /otp/add, /otp/clear
|
||||
Emails | _None_
|
||||
Middlewares | [LoadClientStateMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.LoadClientStateMiddleware)
|
||||
ClientStorage | Session and Cookie
|
||||
ServerStorer | [ServerStorer](https://godoc.org/github.com/volatiletech/authboss/#ServerStorer)
|
||||
User | [otp.User](https://godoc.org/github.com/volatiletech/authboss/otp/#User)
|
||||
Values | [UserValuer](https://godoc.org/github.com/volatiletech/authboss/#UserValuer)
|
||||
Mailer | _None_
|
||||
|
||||
One time passwords can be useful if users require a backup password in case they lose theirs,
|
||||
or they're logging in on an untrusted computer. This module allows users to add one time passwords,
|
||||
clear them, or log in with them.
|
||||
|
||||
Logging in with a one time password instead of a password is identical to having logged in normally
|
||||
with their typical password with the exception that the one time passwords are consumed immediately
|
||||
upon use and cannot be used again.
|
||||
|
||||
`otp` should not be confused with two factor authentication. Although 2fa also uses one-time passwords
|
||||
the `otp` module has nothing to do with it and is strictly a mechanism for logging in with an alternative
|
||||
to a user's regular password.
|
||||
|
||||
## Two Factor Authentication
|
||||
|
||||
2FA in Authboss is implemented in a few separate modules: twofactor, totp2fa and sms2fa.
|
||||
|
||||
You should use two factor authentication in your application if you want additional security beyond
|
||||
that of just simple passwords. Each 2fa module supports a different mechanism for verifying a second
|
||||
factor of authentication from a user.
|
||||
|
||||
### Two-Factor Recovery
|
||||
|
||||
| Info and Requirements | |
|
||||
| --------------------- | -------- |
|
||||
Module | twofactor
|
||||
Pages | recovery2fa
|
||||
Routes | /2fa/recovery/regen
|
||||
Emails | _None_
|
||||
Middlewares | [LoadClientStateMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.LoadClientStateMiddleware)
|
||||
ClientStorage | Session
|
||||
ServerStorer | [ServerStorer](https://godoc.org/github.com/volatiletech/authboss/#ServerStorer)
|
||||
User | [twofactor.User](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/#User)
|
||||
Values | _None_
|
||||
Mailer | _None_
|
||||
|
||||
**Note:** Unlike most modules in Authboss you must construct a `twofactor.Recovery` and call `.Setup()`
|
||||
on it to enable this module. See the sample to see how to do this. This may be changed in the future.
|
||||
|
||||
Package twofactor is all about the common functionality of providing backup codes for two factor
|
||||
mechanisms. Instead of each module implementing backup codes on it's own, common functionality has
|
||||
been put here including a route to regenerate backup codes.
|
||||
|
||||
Backup codes are useful in case people lose access to their second factor for authentication. This happens
|
||||
when users lose their phones for example. When this occurs, they can use one of their backup-codes.
|
||||
|
||||
Backup codes are one-time use, they are bcrypted for security, and they only allow bypassing the 2fa
|
||||
authentication part, they cannot be used in lieu of a user's password, for that sort of recovery see
|
||||
the `otp` module.
|
||||
|
||||
### Time-Based One Time Passwords 2FA (totp)
|
||||
|
||||
| Info and Requirements | |
|
||||
| --------------------- | -------- |
|
||||
Module | totp2fa
|
||||
Pages | totp2fa_{setup,confirm,remove,validate}, totp2fa_{confirm,remove}_success
|
||||
Routes | /2fa/totp/{setup,confirm,qr,remove,validate}
|
||||
Emails | _None_
|
||||
Middlewares | [LoadClientStateMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.LoadClientStateMiddleware)
|
||||
ClientStorage | Session **(SECURE!)**
|
||||
ServerStorer | [ServerStorer](https://godoc.org/github.com/volatiletech/authboss/#ServerStorer)
|
||||
User | [totp2fa.User](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/totp2fa/#User)
|
||||
Values | [TOTPCodeValuer](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/totp2fa/#TOTPCodeValuer)
|
||||
Mailer | _None_
|
||||
|
||||
**Note:** Unlike most modules in Authboss you must construct a `totp2fa.TOTP` and call `.Setup()`
|
||||
on it to enable this module. See the sample to see how to do this This may be changed in the future.
|
||||
|
||||
**Note:** To allow users to regenerate their backup codes, you must also use the `twofactor` module.
|
||||
|
||||
**Note:** Routes are protected by `authboss.Middleware` so only logged in users can access them.
|
||||
You can configure whether unauthenticated users should be redirected to log in or are 404'd using
|
||||
the `authboss.Config.Modules.RoutesRedirectOnUnathed` configuration flag.
|
||||
|
||||
#### Adding 2fa to a user
|
||||
|
||||
When a logged in user would like to add 2fa to their account direct them `GET /2fa/totp/setup`, the `GET`
|
||||
on this page does virtually nothing so you don't have to use it, just `POST` immediately to have
|
||||
a smoother flow for the user. **This puts the 2fa secret in their session temporarily meaning you must
|
||||
have proper secure sessions for this to be secure.**
|
||||
|
||||
They will be redirected to `GET /2fa/totp/confirm` where the data will show `totp2fa.DataTOTPSecret`,
|
||||
this is the key that user's should enter into their Google Authenticator or similar app. Once they've
|
||||
added it they need to send a `POST /2fa/totp/confirm` with a correct code which removes the 2fa secret
|
||||
from their session and permanently adds it to their `totp2fa.User` and 2fa is now enabled for them.
|
||||
The data from the `POST` will contain a key `twofactor.DataRecoveryCodes` that contains an array
|
||||
of recovery codes for the user.
|
||||
|
||||
If you wish to show the user a QR code, `GET /2fa/totp/qr` at any time during or after totp2fa setup
|
||||
will return a 200x200 png QR code that they can scan.
|
||||
|
||||
#### Removing 2fa from a user
|
||||
|
||||
A user begins by going to `GET /2fa/totp/remove` and enters a code which posts to `POST /2fa/totp/remove`
|
||||
and if it's correct they're shown a success page and 2fa is removed from them, if not they get
|
||||
validation errors.
|
||||
|
||||
#### Logging in with 2fa
|
||||
|
||||
When a user goes to log in, the `totp` module checks the user after they log in for the presence of
|
||||
a totp2fa secret, if there is one it does not give them a logged in session value immediately and
|
||||
redirects them to `GET /2fa/totp/validate` where they must enter a correct code to `POST /2fa/totp/validate`
|
||||
if the code is correct they're logged in normally as well as they get the session value
|
||||
`authboss.Session2FA` set to `"totp"` to prove that they've authenticated with two factors.
|
||||
|
||||
#### Using Recovery Codes
|
||||
|
||||
Both when logging in and removing totp2fa from an account, a recovery code may be used instead. They can
|
||||
`POST` to the same url, they simply send a different form field. The recovery code is consumed on use
|
||||
and may not be used again.
|
||||
|
||||
### Text Message 2FA (sms)
|
||||
|
||||
Package sms2fa uses sms shared secrets as a means to authenticate a user with a second factor:
|
||||
their phone number.
|
||||
|
||||
| Info and Requirements | |
|
||||
| --------------------- | -------- |
|
||||
Module | sms2fa
|
||||
Pages | sms2fa_{setup,confirm,remove,validate}, sms2fa_{confirm,remove}_success
|
||||
Routes | /2fa/{setup,confirm,remove,validate}
|
||||
Emails | _None_
|
||||
Middlewares | [LoadClientStateMiddleware](https://godoc.org/github.com/volatiletech/authboss/#Authboss.LoadClientStateMiddleware)
|
||||
ClientStorage | Session (**SECURE!**)
|
||||
ServerStorer | [ServerStorer](https://godoc.org/github.com/volatiletech/authboss/#ServerStorer)
|
||||
User | [sms2fa.User](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/sms2fa/#User), [sms2fa.SMSNumberProvider](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/sms2fa/#SMSNumberProvider)
|
||||
Values | [SMSValuer](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/sms2fa/#SMSValuer), [SMSPhoneNumberValuer](https://godoc.org/github.com/volatiletech/authboss/otp/twofactor/sms2fa/#SMSPhoneNumberValuer)
|
||||
Mailer | _None_
|
||||
|
||||
**Note:** Unlike most modules in Authboss you must construct a `sms2fa.SMS` and call `.Setup()`
|
||||
on it to enable this module. See the sample to see how to do this. This may be changed in the future.
|
||||
|
||||
**Note:** To allow users to regenerate their backup codes, you must also use the `twofactor` module.
|
||||
|
||||
**Note:** Routes are protected by `authboss.Middleware` so only logged in users can access them.
|
||||
You can configure whether unauthenticated users should be redirected to log in or are 404'd using
|
||||
the `authboss.Config.Modules.RoutesRedirectOnUnathed` configuration flag.
|
||||
|
||||
**Note:** sms2fa always stores the code it's expecting in the user's session therefore **you must
|
||||
have secure sessions or the code itself is not secure!**
|
||||
|
||||
**Note:** sms2fa pages all send codes via sms on `POST` when no data code is given. This is also how
|
||||
users can resend the code in case they did not get it (for example a second
|
||||
`POST /2fa/sms/{confirm,remove}` with no form-fields filled in will end up resending the code).
|
||||
|
||||
**Note:** Sending sms codes is rate-limited to 1 sms/10 sec for that user, this is controlled by placing
|
||||
a timestamp in their session to prevent abuse.
|
||||
|
||||
#### Adding 2fa to a user
|
||||
|
||||
When a logged in user would like to add 2fa to their account direct them `GET /2fa/sms/setup` where
|
||||
they must enter a phone number. If the logged in user also implements `sms2fa.SMSNumberProvider` then
|
||||
this interface will be used to retrieve a phone number (if it exists) from the user and put it in
|
||||
`sms2fa.DataSMSPhoneNumber` so that the user interface can populate it for the user, making it convenient
|
||||
to re-use an already saved phone number inside the user.
|
||||
|
||||
Once they `POST /2fa/sms/setup` with a phone number, the `sms2fa.Sender` interface will be
|
||||
invoked to send the SMS code to the user and they will be redirected to `GET /2fa/sms/confirm` where
|
||||
they enter the code they received which does a `POST /2fa/sms/confirm` to store the phone number
|
||||
they were confirming permanently on their user using `sms2fa.User` which enables sms2fa for them.
|
||||
The data from the `POST` will contain a key `twofactor.DataRecoveryCodes` that contains an array
|
||||
of recovery codes for the user.
|
||||
|
||||
#### Removing 2fa from a user
|
||||
|
||||
A user begins by going to `GET /2fa/sms/remove`. This page does nothing on it's own. In order to
|
||||
begin the process `POST /2fa/sms/remove` with no data (or a recovery code to skip needing the sms code)
|
||||
to send the sms code to the user. Then they can `POST /2fa/sms/remove` again with the correct code
|
||||
to have it permanently removed.
|
||||
|
||||
#### Logging in with 2fa
|
||||
|
||||
When a user goes to log in, the `sms` module checks the user after they log in for the presence of
|
||||
a sms2fa phone number, if there is one it does not give them a logged in session value but instead
|
||||
sends an SMS code to their configured number and and redirects them to `GET /2fa/sms/validate`
|
||||
where they must enter a correct code to `POST /2fa/totp/validate`. If the code is correct they're
|
||||
logged in normally as well as they get the session value `authboss.Session2FA` set to `"sms"` to prove
|
||||
that they've authenticated with two factors.
|
||||
|
||||
#### Using Recovery Codes
|
||||
|
||||
Same as totp2fa above.
|
||||
|
||||
## Rendering Views
|
||||
|
||||
@@ -576,7 +813,9 @@ system into that interface.
|
||||
### JSON Views
|
||||
|
||||
If you're building an API that's mostly backed by a javascript front-end, then you'll probably
|
||||
want to use a renderer that returns JSON. There is a simple json renderer available in the [defaults package](https://github.com/volatiletech/authboss/defaults) package if you wish to use that.
|
||||
want to use a renderer that converts the data to JSON. There is a simple json renderer available in
|
||||
the [defaults package](https://github.com/volatiletech/authboss/defaults) package if you wish to
|
||||
use that.
|
||||
|
||||
### Data
|
||||
|
||||
|
10
tov2.md
10
tov2.md
@@ -67,9 +67,9 @@ which wraps the responsewriter with a new one that has the ability to manage cli
|
||||
In the ClientStateReadWriter interface (the one you now implement to handle sessions and cookies)
|
||||
you now return a ClientState interface (basically a map of values) that represents a snapshot of the
|
||||
state of the client when the request was initially read, this ensures that code will use the context
|
||||
for value passing and not the session as an added bonus. But basically caches the client state
|
||||
values for the remainder of the request.
|
||||
for value passing through the middleware stack and not the session as an added bonus.
|
||||
Essentially this ClientState caches the values for the remainder of the request.
|
||||
|
||||
Events are written to the ResponseWriter and eventually the `WriteState` method is called and give
|
||||
the old state and the events that occurred during request processing, asks for a new state to be
|
||||
written out to the responsewriter's headers.
|
||||
Events are written to the ResponseWriter and eventually the `WriteState` method is called and is
|
||||
given the old state and the events that occurred during request processing, asks for a new state
|
||||
to be written out to the responsewriter's headers.
|
||||
|
@@ -22,8 +22,7 @@ type BodyReader interface {
|
||||
Read(page string, r *http.Request) (Validator, error)
|
||||
}
|
||||
|
||||
// UserValuer gets a string from a map-like data structure
|
||||
// Typically a decoded JSON or form auth request
|
||||
// UserValuer allows us to pull out the PID and Password from the request.
|
||||
type UserValuer interface {
|
||||
Validator
|
||||
|
||||
|
Reference in New Issue
Block a user