2017-04-05 86 views
2

我試圖通過使用AWS Cognito和用戶池的API來使用身份驗證工作。我有通過AWS Cognito用戶池創建的用戶,並且正在嘗試與用戶一起登錄。AWS - nodejs SDK - CognitoIdentityServiceProvider.initiateAuth - CredentialsError:在配置中缺少憑據

我得到的錯誤是CredentialsError: Missing credentials in config。具體來說,它告訴我,我需要一個IdentityPoolId。但我似乎無法在我的AWS控制檯中找到這個IdentityPoolId。哪裏可以找到我的用戶池?我看到的只有一個Pool ID和一個Pool ARN。

enter image description here

相關的源代碼:

var aws = require('aws-sdk'); 
aws.config.update({ 
    region: 'us-east-1', 
    credentials: new aws.CognitoIdentityCredentials({ 
     IdentityPoolId: '???' 
    }) 
}); 


var authUser = function(params, callback) 
{ 
    if (!params || !params.Email || !params._password) 
    { 
     callback(new Error('Invalid parameters.')); 
     return false; 
    } 

    var cognito = new aws.CognitoIdentityServiceProvider(); 

    var authParams = { 
     AuthFlow: 'USER_SRP_AUTH', // not sure what this means... 
     ClientId: conf.AWSConfig.ClientId, 
     AuthParameters: { 
      Username: params.Email, 
      Password: params._password 
     } 
    }; 

    cognito.initiateAuth(authParams, function(err, data) 
    { 
     if (err) 
     { 
      console.log('Error details: ' + util.inspect(err)); 
      callback(err); 
      return false; 
     } 
     callback(null, {success: true, data: data}); 
    }); 
} 

對於authParams對象,我不知道該AuthFlow應該是什麼。看着http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html#initiateAuth-property它好像USER_SRP_AUTH是我應該使用的。

編輯:

我相信我可能已經找到哪裏得到我的IdentityPoolId。我查看了我的Federated Identities部分,並在編輯身份池時在Authentication Providers部分下的相應User Pool中添加了該部分。

enter image description here

我相關的Authentication ProviderCognito來,我通過輸入User Pool IDApp Client ID爲該用戶池創建我的用戶羣。現在使用相同的代碼Identity pool ID我得到錯誤CredentialsError: Missing credentials in config。它說Unauthorized access is not supported for this identity pool。好的...我試圖授權用戶...我是否需要創建未經身份驗證的角色,以便用戶可以在未通過身份驗證時進行身份驗證?這似乎很愚蠢,如果這是我需要做的。

編輯2:

我也應該注意到,我能夠登錄並獲得一個AccessToken以及一個IdTokenRefreshToken使用JavaScript SDK(沒有的NodeJS)。我做了這個,不需要IdentityPoolId。我唯一需要的是UserPoolIdClientId

var authenticateUser = function(onSuccessCallback) 
{ 
    var authData = { 
     Username: getUserName(), // gets username from an html text field 
     Password: getPassword() // gets password from an html password field 
    }; 

    var authDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authData); 

    var cognitoUser = getCognitoUser(); 

    cognitoUser.authenticateUser(authDetails, 
    { 
     onSuccess: function(result) 
     { 
      console.log('access token: ' + result.getAccessToken().getJwtToken()); 
      console.log('idToken: ' + result.idToken.jwtToken); 
      console.log(result); 

      if (onSuccessCallback && typeof(onSuccessCallback) == 'function') 
      { 
       onSuccessCallback(cognitoUser); 
      } 
     }, 
     onFailure: function(err) 
     { 
      // UserNotConfirmedException: User is not confirmed. 
      console.log('authError'); 
      alert(err); 
     } 
    }); 
} 

回答

2

原來,initiateAuth根本不是我想要做的。我也錯過了一個名爲amazon-cognito-identity-js的npm包。安裝後,我更新了我的代碼,如下所示:

var authUser = function(params, callback) 
{ 
    if (!params || !params.Email || !params._password) 
    { 
     callback(new Error('Invalid parameters.')); 
     return false; 
    } 

    var poolData = { 
     UserPoolId: conf.AWSConfig.UserPoolId, 
     ClientId: conf.AWSConfig.ClientId 
    }; 

    var userPool = new aws.CognitoIdentityServiceProvider.CognitoUserPool(poolData); 
    var authData = { 
     Username: params.Email, 
     Password: params._password 
    }; 

    var authDetails = new aws.CognitoIdentityServiceProvider.AuthenticationDetails(authData); 
    var userData = { 
     Username: params.Email, 
     Pool: userPool 
    }; 

    var cognitoUser = new aws.CognitoIdentityServiceProvider.CognitoUser(userData); 

    cognitoUser.authenticateUser(authDetails, { 
     onSuccess: function(result) 
     { 
      callback(null, {success: true, data: result}); 
     }, 
     onFailure: function(err) 
     { 
      console.log('authUser error: ' + util.inspect(err)); 
      callback(err); 
     } 
    }); 
} 

我現在已經成功地獲得了令牌響應!萬歲!