Plugin d'Autenticazione
Cos'è un plugin d'autenticazione?
È un tipo di plugin che consente di gestire chi accede o pubblica in un pacchetto specifico. Di default la htpasswd
è integrata, ma è facilmente sostituibile dalla tua.
Per Iniziare
I plugin d'autenticazione sono definiti nella sezione auth:
, come segue:
auth:
htpasswd:
file: ./htpasswd
anche più plugin possono essere incatenati:
auth:
htpasswd:
file: ./htpasswd
anotherAuth:
foo: bar
bar: foo
lastPlugin:
foo: bar
bar: foo
Se uno dei plugin nella catena può risolvere la richiesta, i prossimi saranno ignorati.
Come funziona il plugin d'autenticazione?
Fondamentalmente, dobbiamo restituire un oggetto con un singolo metodo chiamato authenticate
, che riceverà 3 argomenti (user, password, callback
).
A ogni richiesta, authenticate
sarà innescato e il plugin dovrebbe restituire le credenziali; se authenticate
fallisce, ricadrà al ruolo $anonymous
di default.
API
interface IPluginAuth<T> extends IPlugin<T> {
authenticate(user: string, password: string, cb: AuthCallback): void;
adduser?(user: string, password: string, cb: AuthCallback): void;
changePassword?(user: string, password: string, newPassword: string, cb: AuthCallback): void;
allow_publish?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
allow_access?(user: RemoteUser, pkg: AllowAccess & PackageAccess, cb: AuthAccessCallback): void;
allow_unpublish?(
user: RemoteUser,
pkg: AllowAccess & PackageAccess,
cb: AuthAccessCallback
): void;
apiJWTmiddleware?(helpers: any): Function;
}
Solo
adduser
,allow_access
,apiJWTmiddleware
,allow_publish
eallow_unpublish
sono facoltativi; Verdaccio fornisce una ricaduta in tutti questi casi.
Metodo apiJWTmiddleware
Dalla v4.0.0
apiJWTmiddleware
è stato introdotto dalla PR#1227, per poter avere il pieno controllo del gestore del token; sovrascrivere questo metodo disabiliterà il supporto a login/adduser
. Consigliamo di non implementare questo metodo a meno che non sia totalmente necessario. Visualizza qui un esempio completo.
Cosa dovrei restituire in ognuno dei metodi?
Verdaccio si affida alle funzioni di callback
, al momento della scrittura di questa documentazione. Ogni metodo dovrebbe chiamare il metodo e, ciò che restituisci, è importante; esaminiamo come farlo.
Callback di authentication
Una volta eseguita l'autenticazione, esistono 2 opzioni per dare una risposta a Verdaccio
.
Se l'autenticazione fallisce
Se l'autenticazione è fallita, restituire false
come il secondo argomento.
callback(null, false);
Se l'autenticazione riesce
L'autenticazione è riuscita.
I groups
(gruppi) sono un insieme di stringhe di cui fa parte l'utente.
callback(null, groups);
Se l'autenticazione produce un errore
Il servizio di autenticazione potrebbe fallire e potresti volerlo riflettere nella risposta dell'utente, es.: il servizio non è disponibile.
import { getInternalError } from '@verdaccio/commons-api';
callback(getInternalError('something bad message), null);
Un fallimento nell'accesso non equivale all'errore del servizio, se vuoi notificare l'utente del fatto che le credenziali sono errate, basta restituire
false
invece di stringhe di gruppi. Il comportamento dipende prevalentemente da te.
Callback di adduser
Se adduser riesce
Se il servizio riesce a creare un utente, restituisci true
come il secondo argomento.
callback(null, true);
Se adduser fallisce
Qualsiasi azione differente dal successo, deve restituire un errore.
import { getConflict } from '@verdaccio/commons-api';
const err = getConflict('maximum amount of users reached');
callback(err);
Callback di changePassword
Se la richiesta riesce
Se il servizio riesce a creare un utente, restituisci true
come il secondo argomento.
const user = serviceUpdatePassword(user, password, newPassword);
callback(null, user);
Se la richiesta fallisce
Qualsiasi azione differente dal successo, deve restituire un errore.
import { getNotFound } from '@verdaccio/commons-api';
const err = getNotFound('user not found');
callback(err);
Callback di allow_access
, allow_publish
, o allow_unpublish
Questi metodi mirano a consentire o negare l'innesco di certe azioni.
Se la richiesta riesce
Se il servizio riesce a creare un utente, restituisci un true
come il secondo argomento.
allow_access(user: RemoteUser, pkg: PackageAccess, cb: Callback): void {
const isAllowed: boolean = checkAction(user, pkg);
callback(null, isAllowed)
}
Se la richiesta fallisce
Qualsiasi azione differente dal successo, deve restituire un errore.
import { getNotFound } from '@verdaccio/commons-api';
const err = getForbidden('not allowed to access package');
callback(err);
Genera un plugin d'autenticazione
Per le informazioni dettagliate, controlla la pagina del nostro generatore di plugin. Esegui il comando yo
nel tuo terminale e segui i passaggi.
➜ yo verdaccio-plugin
Appena trovato un `.yo-rc.json` in una cartella madre.
Impostando il root del progetto a: /Users/user/verdaccio_yo_generator
_-----_ ╭──────────────────────────╮
| | │ Benvenuto al generatore│
|--(o)--| │ generator-verdaccio-plug │
`---------´ │ di plugin! │
( _´U`_ ) ╰──────────────────────────╯
/___A___\ /
| ~ |
__'.___.'__
´ ` |° ´ Y `
? Qual è il nome del tuo plugin? service-name
? Seleziona la Lingua
typescript
? Che tipo di plugin vuoi creare? auth
? Sei pregato di descrivere il fantastico plugin d'autenticazione del tuo plugin
? Nome utente o dell'organizzazione di GitHub myusername
? Nome dell'Autore Mario Rossi
? Email dell'Autore mariorossi@gmail.com
? Accorda le tue parole chiave (virgola per dividere) verdaccio,plugin,autenticazione,fantastico,verdaccio-plugin
create verdaccio-plugin-authservice-name/package.json
create verdaccio-plugin-authservice-name/.gitignore
create verdaccio-plugin-authservice-name/.npmignore
create verdaccio-plugin-authservice-name/jest.config.js
create verdaccio-plugin-authservice-name/.babelrc
create verdaccio-plugin-authservice-name/.travis.yml
create verdaccio-plugin-authservice-name/README.md
create verdaccio-plugin-authservice-name/.eslintrc
create verdaccio-plugin-authservice-name/.eslintignore
create verdaccio-plugin-authservice-name/src/index.ts
create verdaccio-plugin-authservice-name/index.ts
create verdaccio-plugin-authservice-name/tsconfig.json
create verdaccio-plugin-authservice-name/types/index.ts
create verdaccio-plugin-authservice-name/.editorconfig
Ho fatto tutto. Eseguendo l'installazione di npm per farti installare le dipendenze necessarie. Se questo fallisce, prova a eseguire tu stesso il comando.
⸨ ░░░░░░░░░░░░░░░░░⸩ ⠋ fetchMetadata: sill pacote range manifest for @babel/plugin-syntax-jsx@^7.7.4 fetc
Dopo il termine dell'installazione, accedi all'impalcatura del tuo progetto.
➜ cd verdaccio-plugin-service-name
➜ cat package.json
{
"nome": "verdaccio-plugin-service-name",
"versione": "0.0.1",
"descrizione": "awesome auth plugin",
...
Esempio di implementazione completa di ES5
function Auth(config, stuff) {
var self = Object.create(Auth.prototype);
self._users = {};
// configurazione per questo modulo
self._config = config;
// registratore di verdaccio
self._logger = stuff.logger;
// passa il registratore di verdaccio a Idapauth
self._config.client_options.log = stuff.logger;
return self;
}
Auth.prototype.authenticate = function (user, password, callback) {
var LdapClient = new LdapAuth(self._config.client_options);
....
LdapClient.authenticate(user, password, function (err, ldapUser) {
...
var groups;
...
callback(null, groups);
});
};
module.exports = Auth;
E la configurazione somiglierà a questa:
auth:
htpasswd:
file: ./htpasswd
Dove htpasswd
è il suffisso del nome del plugin. es.: verdaccio-htpasswd
e il resto del corpo sarebbero i parametri di configurazione del plugin.
Elenco di Plugin d'Autenticazione della Community
- verdaccio-bitbucket: Plugin d'autenticazione di Bitbucket per Verdaccio.
- verdaccio-bitbucket-server: Plugin d'autenticazione del Server di Bitbucket per Verdaccio.
- verdaccio-ldap: Plugin d'autenticazione di LDAP per Verdaccio.
- verdaccio-active-directory: Plugin d'autenticazione di Active Directory per Verdaccio
- verdaccio-gitlab: usa il Token d'Accesso Personale di GitLab per autenticarti
- verdaccio-gitlab-ci: Abilita la CI di GitLab per autenticarti contro Verdaccio.
- verdaccio-htpasswd: Autenticazione basata sul plugin del file htpasswd (integrato) per Verdaccio
- verdaccio-github-oauth: Plugin d'autenticazione Oauth di Github per Verdaccio.
- verdaccio-github-oauth-ui: Plugin di OAuth di GitHub per il pulsante d'accesso di Verdaccio.
- verdaccio-groupnames: Plugin per gestire le associazioni dinamiche di gestione usando la sintassi
$group
. Funziona meglio con il plugin di Idap. - verdaccio-sqlite: Plugin d'Autenticazione di SQLite per Verdaccio
- verdaccio-okta-auth Autenticazione Okta di Verdaccio
- verdaccio-azure-ad-login Fa autenticare i tuoi utenti in Verdaccio tramite l'API di OAuth 2.0 di Azure AD
- verdaccio-auth-gitlab Plugin d'autenticazione di Verdaccio per token d'accesso personali di GitLab.
Hai sviluppato un nuovo plugin? Aggiungilo qui!