Newsgroup: it.comp.os.linux.sys
Titolo: [LUNGO] API Rest e provider oAuth esterni

Scrivo qui, anche se è più un argomento di programmazione generale che PHP, ma non ho trovato il gruppo apposito.
 
Ho un problema dal quale non riesco a venirne a capo.
La situazione è questa: webservice che esporta delle API RESTFul, frontend javascript (con un po di php dietro), utenti che si devono collegare al frontend, autenticandosi alle api mediante user/password OPPURE oauth di provider esterni.
 
In una situazione normale, senza un webservice json di mezzo, il sito web reindirizzerebbe l'utente alla pagina di login, in tale pagina l'utente sceglie con quale provider autenticarsi, ed il sito web effettua tutta la procedura di autenticazione arrivando ad ottenere un access token.
 
Facile, veloce, già fatto decine di volte senza problemi.
 
Ora però non ho un sito web ma un webservice, che risponde esclusivamente in JSON alle richieste che possono provenire da chiunque (tra cui il mio frontend javascript + PHP), ma sopratutto da cURL da linea di comando.
 
Questo rende impossibile effettuare ogni sorta di redirect o aprire ogni sorta di browser, di conseguenza non so come implementare l'autenticazione oauth verso, ad esempio, Google o GitHub.
 
Pensavo a questa bizzarra soluzione:
Le mie API si aspettano una autenticazione di base o una autenticazione Bearer mediante access token. In caso di autenticazione base, autentico localmente, in caso di token, rigiro il token al provider, lo faccio convalidare e se tutto OK eseguo la richiesta dell'utente. Così facendo, però, ogni richiesta mediante token comporta un controllo anche sul server remoto, con evidente calo di performance e consdierato che le mie API sono REST, di richieste se ne fanno a vagonate. (sono tante piccole richieste invece di una grossa singola)
 
Restano però tre problemi: 
 
1. tutto l'"handshake" oauth, chi lo fa? Così facendo, le mie API si aspettano un access token, ovvero una autenticazione già avvenuta da qualche parte fuori dal mio controllo. Pensavo di usare il workflow implicito di oauth direttamente sul client javascript. Il client sa di dover accedere a risorse protette (si vede un bel 403 al primo tentativo), fa l'autenticazione oauth, riceve un token, ripete la richiesta alla api passando il token. Tutto molto semplice, ma mi sembra un tantino "fuori standard", non vorrei pregiudicare la futura compatibilità con sviluppatori esterni
 
2. come faccio a sapere che il token passato sia quello di Google e non di GitHub o Facebook? Da cosa lo riconosco? Pensavo di passare un header extra tipo: "X-oAuth-Provider: google" in modo da identificare chi dover contattare per la convalida, ma questo mi sembra più porcheria di prima.
 
3. con questa strana soluzione ciascun sviluppatore che vuole realizzare il proprio client di accesso alle mie API dovrebbe registrare il proprio client presso il provider oauth, complicando ulteriormente le cose. Normalmente, visto che i dati di autenticazione servono a me e non allo sviluppatore finale, sono io che devo registrare la mia app al provider.
 
Qualche idea ? Far autenticare il client per i fatti suoi e poi rigirarmi il token non mi convince molto. Possibile che non ci sia qualche schema implementativo su una autenticazione oauth a 3 segmenti (io, il provider, l'enduser) che preveda l'uso di API stateless e client stupidi non in grado di fare redirect o cose simili?
 
In altre parole, da curl o bash, senza browser o altro, come diavolo faccio l'autenticazione oauth ? Mi autentico per i fatti miei (magari da un altro PC), mi prendo il token e lo uso tramite curl? In pratica, replico la mia soluzione dove l'enduser provvede per i fatti suoi ad autenticarsi., ma non vedo alternative.

 Scrivo qui, anche se è più un argomento di programmazione generale che PHP, ma non ho trovato il gruppo apposito.
 
Azz, ho sbagliato gruppo, pensavo di essere su .php
Scusate.
 
(però, visto che ci sono, ogni suggerimento è ben accolto)