Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor OAuth API登录_Meteor_Meteor Accounts - Fatal编程技术网

Meteor OAuth API登录

Meteor OAuth API登录,meteor,meteor-accounts,Meteor,Meteor Accounts,我正在使用Meteor Facebook/Accounts Facebook软件包创建一个新的第三方登录,我遇到以下错误: Exception while invoking method 'login' Error: Service data for service storenvy must include id

我正在使用Meteor Facebook/Accounts Facebook软件包创建一个新的第三方登录,我遇到以下错误:

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, 选项:{profile:{name:identity.name}}

好吧,我想出来了:serviceData向它添加ID,它就可以工作了! var serviceData={ id:identity.data.id, 电子邮件:identity.data.email, 用户名:identity.data.login, accessToken:accessToken, expiresAt:+新日期+1000*response.expiresIn };