2014-11-17 3 views
0

Я создаю новый логин Стороннее с помощью Метеор Facebook/Accounts-Facebook пакеты, как, например, и я застрял на следующей ошибки:Метеор OAuth API Войти

Exception while invoking method 'login' Error: Service data for service storenvy must include id                               
at Object.Accounts.updateOrCreateUserFromExternalService (packages/accounts-base/accounts_server.js:1138)                            
at Package (packages/accounts-oauth/oauth_server.js:45)                                        
at packages/accounts-base/accounts_server.js:383                                          
at tryLoginMethod (packages/accounts-base/accounts_server.js:186)                                      
at runLoginHandlers (packages/accounts-base/accounts_server.js:380)   
at tryLoginMethod (packages/accounts-base/accounts_server.js:186)                                      
at runLoginHandlers (packages/accounts-base/accounts_server.js:380)                                     
t Meteor.methods.login (packages/accounts-base/accounts_server.js:434)                                    
at maybeAuditArgumentChecks (packages/ddp/livedata_server.js:1599)                                      
at packages/ddp/livedata_server.js:648                                             
_.extend.withValue (packages/meteor/dynamics_nodejs.js:56)                                       
at packages/ddp/livedata_server.js:647   

Мой код:

Storenvy = {}; 

OAuth.registerService('storenvy', 2, null, function(query) { 

    var response = getTokens(query); 
    var accessToken = response.accessToken; 
    var identity = getIdentity(accessToken); 

    var serviceData = { 
    accessToken: accessToken, 
    expiresAt: (+new Date) + (1000 * response.expiresIn) 
    }; 

    // include all fields from dropbox 
    // https://www.dropbox.com/developers/core/docs#account-info 
    //var fields = _.pick(identity, ['first_name', 'last_name']); 
    var whitelisted = ['id', 'login', 'name', 'email', 'created_at', 'bio', 'location', 'gender', 'birthday', 'facebook', 'twitter', 'avatar']; 
    var fields = _.pick(identity, whitelisted); 
    _.extend(serviceData, fields); 

    if (response.refreshToken) 
    serviceData.refreshToken = response.refreshToken; 

    return { 
    serviceData: serviceData, 
    options: {profile: {name: identity.name}} 
    }; 
}); 


// returns an object containing: 
// - accessToken 
// - expiresIn: lifetime of token in seconds 
var getTokens = function (query) { 
    var config = ServiceConfiguration.configurations.findOne({service: 'storenvy'}); 
    if (!config) 
    throw new ServiceConfiguration.ConfigError(); 

    var response; 
    try { 
    // Request an access token 
    response = HTTP.post(
     "https://api.storenvy.com/oauth/token", {params: { 
     client_id: config.appId, 
     client_secret: OAuth.openSecret(config.secret), 
     code: query.code, 
     grant_type: 'authorization_code', 
     redirect_uri: OAuth._redirectUri('storenvy', config) 
     }}); 
    } catch (err) { 
    throw _.extend(new Error("Failed to complete OAuth handshake with storenvy1. " + 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 storenvy2. " + response.data.error); 
    } else { 
    return { 
     accessToken: response.data.access_token, 
     refreshToken: response.data.refresh_token, 
     expiresIn: response.data.expires_in 
    }; 
    } 
}; 

var getIdentity = function (accessToken) { 
    try { 
    return Meteor.http.get("https://api.storenvy.com/v1/me", 
     {params: {access_token: accessToken}}).data; 
    } catch (err) { 
    throw new Error("Failed to fetch identity from storenvy. " + err.message); 
    } 
}; 

Storenvy.retrieveCredential = function(credentialToken, credentialSecret) { 
    return OAuth.retrieveCredential(credentialToken, credentialSecret); 
}; 

Я действительно не могу понять, что и как var getIdentity и код ниже работают. Для этого недостает документа, потому что я ничего не могу найти, поэтому ваша помощь очень ценится! serviceData: serviceData, options: {profile: {name: identity.name}}

ответ

0

ОК, поэтому я выяснил: serviceData добавьте идентификатор к нему, и он работает! var serviceData = { id: identity.data.id, email: identity.data.email, username: identity.data.login, accessToken: accessToken, expiresAt: (+new Date) + (1000 * response.expiresIn) };

Смежные вопросы