4

我正在使用AWS Lambda,Cognito和API Gateway(與Serverless編排)爲我的Web應用程序構建API。AWS Lambda - Cognito Identity ID使用相同的登錄名更改

用戶認證使用Cognito,然後使一個認證請求到API(圖案從Serverless Stack教程,其中I抓住他們Cognito ID複製:

event.requestContext.identity.cognitoIdentityId

然後我搶相關聯的用戶記錄與cognitoIdentityId執行基於角色/權限的邏輯並返回相關數據

我一直在遇到的麻煩是,當不同的人(我正在使用其他開發者,目前)使用相同的憑據登錄,但是fr om不同的計算機(以及在某些情況下的國家),cognitoIdentityId與他們的請求發送完全不同 - 爲同一用戶userPool用戶記錄!

注:我不任何 「聯合身份」(即,臉譜等)整合。這是簡單的舊電子郵件登錄。每個人都使用相同的信用卡,但有些人的請求來自不同的Cognito ID。

這是非常有問題的,因爲我沒有看到另一種方式來唯一標識與Cognito記錄關聯的數據庫中的用戶記錄。

問題:我缺少的東西?有一個更好的方法嗎?這是預期的行爲?


的API是目前實際上插入數據庫。由於我們的數據結構仍然不穩定,應用程序遠離現場,因此我創建了一個API,它像數據庫一樣集成了數據庫並返回數據,但該數據只存儲在JSON文件中。我會重現下面的一些相關代碼,以防萬一它是相關的。

一個例子拉姆達,用於獲取當前用戶:

export function getSelf(event, context, callback) { 
    const { cognitoID } = parser(event); 

    const requester = cognitoID && users.find(u => u.cognitoID === cognitoID); 

    try { 
    if (requester) { 
     return callback(null, success(prep(requester, 0))); 
    } else { 
     return authError(callback, `No user found with ID: ${cognitoID}`); 
    } 
    } catch (error) { 
    return uncaughtError(callback, error); 
    } 
} 

那解析器的東西往上頂只是一個實用程序來得到我想要的ID。

相關的用戶記錄可能是這樣的:

{ 
    cognitoID: 'us-west-2:605249a8-8fc1-40ed-bf89-23bc74ecc232', 
    id: 'some-slug', 
    email: '[email protected]', 
    firstName: 'John', 
    lastName: 'Jacob Jingleheimer Schmidt', 
    headshot: 'http://fillmurray.com/g/300/300', 
    role: 'admin' 
    }, 
+1

你能否讓我的身份池ID,用戶池ID,用戶名和其他開發商收到的身份ID? –

+0

@RachitDhall - PMing似乎不是SO上的功能! https://meta.stackexchange.com/questions/431/any-way-to-send-a-personal-message-to-another-user - 我沒有看到您的個人資料上的聯繫信息。如果您通過redshiftdigitalcom.com的sasha給我發電子郵件,我可以回覆信息。謝謝! – Sasha

回答

0

Cognito用戶池是用來驗證用戶身份併爲您提供JWT令牌。當您想訪問任何AWS服務時,您需要AWS憑證(訪問密鑰和密鑰)。這是您應該使用聯合身份驗證的地方。您從Cognito用戶池獲得的令牌應與Federated Identities進行交換,以獲取AWS憑證以訪問其他AWS服務。無服務器堆棧也包含在detail中。

現在,由於您尚未將用戶池添加爲身份池中的身份驗證提供程序,我的觀察結果是您從聯合身份驗證中獲取了未經身份驗證的身份(您可以從Amazon Cognito控制檯確認這一點),這就是爲什麼它對於每個團隊成員而言都不相同。您應該將用戶池作爲身份驗證提供程序添加到身份池中,並按照documentation提供登錄映射中所需的信息。

相關問題