2015-02-26 14 views
5

Come eseguire l'autenticazione tramite il server token personalizzato in Meteor.js?Meteor.js e server OpenId Connect personalizzato

Esiste un pacchetto come account-google per server di token personalizzati che gestisce l'autenticazione semplicemente prendendo endpoint token, ID client, secrete e scope come parametro di configurazione.

risposta

5

Non conosco un pacchetto oauth generico. Ma non dovrebbe essere troppo difficile scrivere un pacchetto per il tuo server particolare, dato che ci sono un certo numero di esempi da guardare.

Utilizzando account-github come esempio, ecco lo code per effettuare la connessione sul client. Si noti l'URL di endpoint, il client id, scope, ecc Questo gestirà il popup per voi, ma probabilmente si vorrà includere CSS personalizzato:

var loginUrl = 
    'https://github.com/login/oauth/authorize' + 
    '?client_id=' + config.clientId + 
    '&scope=' + flatScope + 
    '&redirect_uri=' + OAuth._redirectUri('github', config) + 
    '&state=' + OAuth._stateParam(loginStyle, credentialToken); 

OAuth.launchLogin({ 
    loginService: "github", 
    loginStyle: loginStyle, 
    loginUrl: loginUrl, 
    credentialRequestCompleteCallback: credentialRequestCompleteCallback, 
    credentialToken: credentialToken, 
    popupOptions: {width: 900, height: 450} 
}); 

Ed ecco un frammento dal lato server, completando il processo per ottenere un token di accesso:

var getAccessToken = function (query) { 
    var config = ServiceConfiguration.configurations.findOne({service: 'github'}); 
    if (!config) 
    throw new ServiceConfiguration.ConfigError(); 

    var response; 
    try { 
    response = HTTP.post(
     "https://github.com/login/oauth/access_token", { 
     headers: { 
      Accept: 'application/json', 
      "User-Agent": userAgent 
     }, 
     params: { 
      code: query.code, 
      client_id: config.clientId, 
      client_secret: OAuth.openSecret(config.secret), 
      redirect_uri: OAuth._redirectUri('github', config), 
      state: query.state 
     } 
     }); 
    } catch (err) { 
    throw _.extend(new Error("Failed to complete OAuth handshake with Github. " + err.message), 
        {response: err.response}); 
    } 
    if (response.data.error) { // if the http response was a json object with an error attribute 
    throw new Error("Failed to complete OAuth handshake with GitHub. " + response.data.error); 
    } else { 
    return response.data.access_token; 
    } 
}; 

e utilizzando il token per ottenere l'identità dell'utente:

var getIdentity = function (accessToken) { 
    try { 
    return HTTP.get(
     "https://api.github.com/user", { 
     headers: {"User-Agent": userAgent}, // http://developer.github.com/v3/#user-agent-required 
     params: {access_token: accessToken} 
     }).data; 
    } catch (err) { 
    throw _.extend(new Error("Failed to fetch identity from Github. " + err.message), 
        {response: err.response}); 
    } 
}; 

il github ed ilI pacchettidovrebbero essere molto utili come riferimenti.

Problemi correlati