2015-02-26 20 views
5

Jak przeprowadzić uwierzytelnianie za pomocą niestandardowego serwera tokenów w Meteor.js?Serwer Meteor.js i niestandardowy serwer OpenId Connect

Czy istnieje pakiet, taki jak accounts-google dla niestandardowego serwera tokenów, który obsługuje uwierzytelnianie, biorąc po prostu punkty końcowe tokena, identyfikator klienta, wyrażenie i zakres jako parametr konfiguracyjny.

Odpowiedz

5

Nie znam ogólnego opakowania oauth. Ale nie powinno być zbyt trudno napisać pakiet dla konkretnego serwera, ponieważ istnieje wiele przykładów do obejrzenia.

Korzystanie z konta-github jako przykładu, oto code do nawiązywania połączenia z klientem. Uwaga URL punktu końcowego, identyfikator klienta, zakres, itd. W ten sposób obsługiwać popup dla ciebie, ale prawdopodobnie będziesz chciał włączyć niestandardowy CSS:

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} 
}); 

A oto fragment z boku server, kończąc proces aby otrzymać token dostępu:

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; 
    } 
}; 

i wykorzystując token, aby uzyskać tożsamość użytkownika:

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}); 
    } 
}; 

github iPakietypowinny być bardzo pomocne jako referencje.