【问题标题】:Identity Id in AWS Cognito changesAWS Cognito 中的身份 ID 更改
【发布时间】:2017-02-02 01:29:42
【问题描述】:

我在客户端上使用 Facebook Login 和 AWS Cognito 建立了身份验证流程。我需要用户在 dynambodb 表中的 facebook id 的引用,并验证 API 调用实际上具有有效的 facebook id,此 facebook id 与 AWS Cognito Id 匹配。 我在这个答案中找到了解决方案:AWS Cognito, Lambda, User credentials in DynamoDB

但我在同一台设备上多次登录 Cognito 后,发现控制台中有几个不同的身份 id。像这样: screen shot

我认为身份 ID 对于具有特定 Facebook id 的特定设备来说是唯一的。我犯了一些错误吗?如果identity id发生变化,如何将Facebook用户的数据存储在dynamoDB中?

这是我的代码:

void Start()

    {
        InitCognito ();

    }
    public void InitCognito()
    {
        UnityInitializer.AttachToGameObject (this.gameObject);
        credentials = new CognitoAWSCredentials (
            identity_pool_id, // Identity Pool ID
            region // Region
        );

        Debug.Log ("identity_pool_id = " + identity_pool_id + " region = " + region);

        credentials.GetIdentityIdAsync(delegate(AmazonCognitoIdentityResult<string>
            result) {
            if (result.Exception != null) {
                Debug.LogError(result.Exception.ToString());
            }
            string identityId = result.Response;
            Debug.Log("identityId = "+identityId);
            FBInit();
        });



    }



    public void FBInit()
    {
        FB.Init(this.OnInitComplete, this.OnHideUnity);
        Debug.Log( "FB.Init() called with " + FB.AppId);

    }

    public void FBLogin()
    {

        FB.LogInWithReadPermissions(new List<string>() { "public_profile", "email", "user_friends" }, this.HandleResult);

    }


    private void OnInitComplete()
    {
        Debug.Log( "Success - Check log for details");
        Debug.Log("Success Response: OnInitComplete Called\n");
        Debug.Log( string.Format(
            "OnInitCompleteCalled IsLoggedIn='{0}' IsInitialized='{1}'",
            FB.IsLoggedIn,
            FB.IsInitialized));

        if (AccessToken.CurrentAccessToken != null)
        {
            Debug.Log("Access token = "+AccessToken.CurrentAccessToken.ToString());
        }
        FBLogin ();
    }

    private void OnHideUnity(bool isGameShown)
    {
        Debug.Log( "Success - Check log for details");
        Debug.Log(string.Format("Success Response: OnHideUnity Called {0}\n", isGameShown));
        Debug.Log("Is game shown: " + isGameShown);
    }
    protected void HandleResult(IResult result)
    {
        if (result == null)
        {
            Debug.Log("Null Response\n");

            return;
        }



        // Some platforms return the empty string instead of null.
        if (!string.IsNullOrEmpty(result.Error))
        {
            Debug.Log( "Error - Check log for details");
            Debug.Log( "Error Response:\n" + result.Error);
        }
        else if (result.Cancelled)
        {
            Debug.Log ("Cancelled - Check log for details");
            Debug.Log( "Cancelled Response:\n" + result.RawResult);
        }
        else if (!string.IsNullOrEmpty(result.RawResult))
        {
            Debug.Log ("Success - Check log for details");
            Debug.Log ("Success Response:\n" + result.RawResult);
            Debug.Log ("Access Token = "+AccessToken.CurrentAccessToken);
            Debug.Log ("Access Token = "+AccessToken.CurrentAccessToken.TokenString);
            Debug.Log ("Access User Id =" + AccessToken.CurrentAccessToken.UserId);
            credentials.AddLogin ("graph.facebook.com", AccessToken.CurrentAccessToken.TokenString);
            if (credentials.CurrentLoginProviders.Length > 0) {
                Debug.Log (credentials.CurrentLoginProviders[0]);
            }

            Debug.Log (credentials.GetCachedIdentityId());
        }
        else
        {
            Debug.Log ( "Empty Response\n");
        }


    }

执行 InitCognito() 方法时,我得到一个未经授权的身份 ID(一旦我在同一设备上重新安装此应用程序,未经授权的身份 ID 就会更改)。我可以成功获取 Facebook 用户 ID 和令牌。在执行 credentials.AddLogin() 方法后,Debug.Log (credentials.GetCachedIdentityId()) 显示 Identity Id 与 unAuthorized Identity Id 相同,而不是引用 Facebook Id 的特定 id。我是否以错误的方式使用了 credentials.AddLogin()?

谢谢!

【问题讨论】:

  • 点击进入这些身份。他们有登录链接吗?
  • 其中两个已链接登录。 “链接登录”字段在第一个字段中显示“graph.facebook.com”,在第二个字段中显示“DISABLED us-east-1”。

标签: amazon-web-services amazon-dynamodb aws-lambda amazon-cognito


【解决方案1】:

显示多个身份的原因是它们未经身份验证。您在不提供 facebook 令牌的情况下提出了很多请求。任何带有 facebook 令牌的请求都会为您提供相同的经过身份验证的 id(您上面提到的那个),但您必须继续提供该令牌才能获得它。这些将映射到一个唯一的 id,但没有一个的请求不会。

【讨论】:

  • 我认为你是对的。但有时经过身份验证的 id 与未经身份验证的 id 相同。也许我的代码中有一些错误。我已将我的代码粘贴到问题中。你能再帮我一次吗?谢谢!
  • 继续 Jeff 的解释,你首先得到一个未经验证的身份 identA。当您向服务提供 FB 令牌和 idenA 时,它将登录链接到此身份,因此 idenA 现在是经过身份验证的身份。下次如果不提供 FB 令牌,会得到一个新的未认证身份 idenB。如果您现在为同一用户提供 FB 令牌,您将获得 idenA。如果 FB 令牌属于不同的用户,idenB 现在将链接到这个新用户。
  • 对于后续的 Lambda 调用,是否会再次传递 FB 令牌?还是“提供”.. FB 令牌和 idenA 给 [??????] 服务”会返回一个会话令牌,将其发送回调用者,并期望调用者将发送该令牌以供将来调用?如果这太 n00b,请随时向我指出实际解释这一点的内容
猜你喜欢
  • 2018-03-31
  • 2014-10-04
  • 2016-10-02
  • 2015-07-07
  • 2017-01-05
  • 2017-10-27
  • 2021-04-26
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多