如何使用Facebook验证使用Cognito的API调用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Facebook验证使用Cognito的API调用?相关的知识,希望对你有一定的参考价值。

我想使用Cognito对用户进行身份验证,并选择使用Facebook。用户可以使用其中任何一个选项sign_in / sign_up。

我创建了Cognito用户池和Cognito联合身份,我也创建了Facebook App进行身份验证。用户池和Facebook应用程序都连接到联合身份。

当我签名并稍后通过Cognito用户池对Cognito用户进行身份验证时,Cognito将返回accessToken,我将其存储在localStorage中,并在需要时进行身份验证。

我有/authenticate端点(快速),它接收用户名和密码,如果一切顺利,则返回accessToken。每当我进行需要auth的API调用时,我都会发送我在本地存储中的accessToken。它或多或少如此:

// POST user/authenticate
const authenticationData = 
  Username: username,
  Password: password


authenticationDetails = new AuthenticationDetails(authenticationData)

const userData = 
  Username: username,
  Pool: userPool()

cognitoUser = new CognitoUser(userData)

cognitoUser.authenticateUser(authenticationDetails, 
  onSuccess: (res) => resolve(res), // here I get accessToken
  onFailure: (err) => 
    console.log('[authenticateUser error]', err)
    reject(err)
  ,
//...

然而

当我使用Facebook时,我没有获得accessToken,我可以以同样的方式使用。我通过FB.login从Facebook获取accessToken,我将其传递给Cognito进行身份验证,然后我不知道该怎么做,因为我无法获得任何可用于验证API调用的令牌,这需要Cognito身份验证。

这是我做的:

await window.FB.login((response) =>  
  props.userFacebookSignIn(response)
)
// ...

call(foo, 'users/facebook_sign_in',  accessToken: payload.facebookAccessToken )
// ...

// users/facebook_sign_in
AWS.config.region = config.AWSRegion
AWS.config.credentials = new AWS.CognitoIdentityCredentials(
  IdentityPoolId: 'foo',
  Logins: 
    'graph.facebook.com': facebookAccessToken
  
)

AWS.config.credentials.get((err) => 
  // Here I get no errors, I presume that I have logged Facebook user in 
  const accessKeyId = AWS.config.credentials.accessKeyId
  const secretAccessKey = AWS.config.credentials.secretAccessKey
  const sessionToken = AWS.config.credentials.sessionToken
  // here I can do stuff probably, 
  // but I would like to receive token that would allow me to do stuff, 
  // rather than context I can do stuff in
)

虽然我正在做所有这些,但我有这种感觉,AWS的开发人员将Cognito作为前端解决方案实现,而不是在后端使用。如果我错了,请纠正我。

不过,我希望能够在快速中间件中交替使用Cognito和Facebook验证api调用。

那可能吗?谢谢。

答案

我使用联合身份进行salesforce单点登录,但我想这些步骤是一样的。在使用Facebook进行身份验证后,您将收到来自他们的id_token作为回应。您必须将此作为getId方法中的参数传递:

var params = 
  IdentityPoolId: 'STRING_VALUE', /* required */
  AccountId: 'STRING_VALUE',
  Logins: 
    '<IdentityProviderName>': 'STRING_VALUE',
    /* 'graph.facebook.com': ... */
  
;
cognitoidentity.getId(params, function(err, data) 
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
);

在结果中,您将获得一个身份ID,您可以将其存储在某处,以便您在进行身份验证时不必每次都进行此调用。现在拿这个身份ID并进行getCredentialsForIdentity调用:

response = client.get_credentials_for_identity(
    IdentityId='string',
    Logins=
        'string': 'string'
    ,
    CustomRoleArn='string'
)

这将最终为您提供所需的临时访问密钥,密钥和会话密钥。

另一答案

我决定使用oAuth。

这是如何快速和肮脏的看看它是如何完成的

AWS的认可

1)设置Cognito用户池。添加App Client将App客户端ID和App客户端密码保存为COGNITO_CLIENT_ID和COGNITO_CLIENT_SECRET

2)转到联盟>身份提供商并添加您的Facebook应用程序ID和应用程序密钥(两者都可以在Facebook应用程序面板中找到)

3)转到应用程序集成>应用程序客户端设置单击“全选”,设置回调URL,我的是localhost:5000 / facebook还选择授权代码授权和允许的OAuth范围(保存范围说:COGNITO_SCOPES)

4)现在转到App integration> Domain name并输入您的自定义域名;让我们说example-app-debug所以它是:https://example-app-debug.auth.us-east-1.amazoncognito.com

这就是Cognito的全部内容

不是Facebook的一部分

5)设置>基本添加example-app-debug.auth.us-east-1.amazoncognito.com到您的应用程序域 - 保存更改

6)在Facebook登录>有效OAuth重定向URI中的设置添加此URL:https://example-app-debug.auth.us-east-1.amazoncognito.com/oauth2/idpresponse和Save Changes

和代码

在浏览器中,登录时将用户重定向到此URL。单击Facebook按钮:

window.location.href =
  `https://example-app-debug.auth.us-east-1.amazoncognito.com/oauth2/authorize` +
    `?identity_provider=Facebook` +
    `&redirect_uri=http://localhost:5000/facebook` +
    `&response_type=code` +
    `&client_id=$COGNITO_CLIENT_ID` +
    `&scope=$COGNITO_SCOPES`

这个调用应该回复给你一个代码,如下所示:http://localhost:5000/facebook?code=foo-bar-code将此代码发送到您的后端。

在后端,执行此操作:

const axios = require('axios')
const url = `` +
`https://$COGNITO_CLIENT_ID:$COGNITO_CLIENT_SECRET` + 
`@example-app-debug.auth.us-east-1.amazoncognito.com/oauth2/token` +
`?grant_type=authorization_code` + 
`&code=foo-bar-code` + // <- code that came from Facebook
`&redirect_uri=http://localhost:5000/facebook` +
`&client_id=$COGNITO_CLIENT_ID`

const response = await axios.post(url) 
// response should have access_token, refresh_token and id_token in data

您将access_token,refresh_token和id_token发送回前端并将其保存在本地存储中并使用它们进行身份验证和完成。

以上是关于如何使用Facebook验证使用Cognito的API调用?的主要内容,如果未能解决你的问题,请参考以下文章

带有 facebook 身份验证的 Amazon cognito 身份管理

操作方法:使用 AWS Cognito 进行 C# .net 核心 API (APIGateway/Lambda) + Xamarin + Facebook 身份验证

自定义Web应用程序中的AWS Cognito社交提供程序

本地主机上 Cognito 托管 UI 的 Facebook 登录设置

在 AWS Cognito 和 Lambda 中获取 Facebook 访问令牌

使用 Amplify 的 federatedSignIn 使用 Cognito 用户池登录 Facebook