[AWSxAmplifyxCognito] Amplify 글로벌 신호 출력이 글로벌 신호를 주지 않는 문제에 대한 응급 처리

개시하다
안녕하세요!
인증 기능이 구현된 경우 다른 장치에 서명한 후 사용자가 로그인한 모든 다른 장치에서 로그아웃하려는 경우가 있죠?
Amplify의 요구를 충족시키기 위해 singOut 함수에 글로벌 옵션이 있습니다. signOut({global:true}) 처럼 서명할 때 사용자가 가지고 있는 모든 영패가 무효화되어 모든 장치에서 서명할 수 있습니다.
아래문서에서 발췌하다

문서에 이렇게 쓰여 있으면 실제로 사용자가 인증 후 취득한 3가지 영패 중 방문 영패와 갱신 영패는 즉시 무효가 된다
사실 signOut({global:true})ID 영패를 만들어도 무효가 되지 않습니다!
또한 세션을 확인하는 함수currentSession,userSession는 코그니토에 유효한 접근 영패와 갱신 영패를 문의하지 않고 로컬 저장 장치의 Id 영패의 유효기간만 확인한다.currentSession, userSession 함수에서 한 장치에서 전역 서명을 해도 다른 장치에서는 Id 토큰이 만료되지 않는 한 사용자가'세션 끊기'로 판단되지 않는다는 것이다.
대응 정책: 실행 중 접근 영패의 함수를 사용하여 세션 중단을 확인합니다currentSession, userSession 함수는 영패 접속과 영패 리셋이 유효한지 검사하지 않습니다.
그러면 유효한지 물어보는 함수를 사용하면 되지만 확인하는 함수만 Amplify 참조에서 찾을 수 없습니다.
따라서 실행할 때 액세스 영패의 함수를 사용하여 유효성과 무효성을 확인합니다.
예를 들어 currentUserInfo 함수는 이와 같다.
이 함수는,
  • 로그인 상태일 때 다음username,attributes(cognito가 설정한 사용자 속성)를 포함하는 대상이 되돌아옵니다.
  • {
        "UserAttributes": [
            {
                "Name": "sub",
                "Value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            },
            {
                "Name": "email_verified",
                "Value": "true"
            },
            {
                "Name": "email",
                "Value": "[email protected]"
            }
        ],
        "Username": "xxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
    
  • 이 장치에 서명하고 장치에 영패가 없을 때null
  • 다른 장치에 서명하고 이 장치에 각종 영패가 있지만 방문 영패가 무효일 때 빈 대상{}이 되돌아온다
  • 따라서 반환 값이 비어 있거나 비어 있을 때 사용자는 신호 출력 상태라고 말할 수 있다.
    다음은 로그인 화면의 설치 예입니다.
    로그인 화면 측면의 설치 예
    로그인할 때만 처리
    서명 출력 상태null or 空オブジェクト의 부정 상태nullでない かつ 空オブジェクトでない에서 로그인 상태인지 관찰합니다.빈 객체가 아니라 속성이 undefined인지 여부를 봅니다.
    
    const getCurrentUserInfo = async () => {
        const currentUserInfo = await Auth.currentUserInfo();
        return currentUserInfo;
    }
    getCurrentUserInfo()
        .then(currentUserInfo =>{
            //以下の場合はサインアウト状態
            //1.currentUserInfo === null:そのデバイスでサインアウトして、デバイスにトークンがないとき
            //2.currentUserInfo.username(などユーザーに関するプロパティ) === undefined: 別のデバイスでサインアウトして、そのデバイスにトークンはあるが、アクセストークンが無効なとき
            if(currentUserInfo !== null && currentUserInfo.username !== undefined){
                //サインインしているときにしたい処理を書く。ログイン画面に飛ばすとか。
            }
        })
        .catch(err=> {
            console.log(err)
        })
    
    로그인 후 화면 설치 예
    왜냐하면 사인이 나갈 때만 처리가 돼요.
    신호 출력 상태null or 空オブジェクト에서 신호 출력 상태에 있는지 관찰한다.
    const getCurrentUserInfo = async () => {
        const currentUserInfo = await Auth.currentUserInfo();
        return currentUserInfo
    }
    getCurrentUserInfo()
        .then(currentUserInfo =>{
            // 以下の場合はサインアウト状態なのでログイン画面に飛ばす。
            //1.currentUserInfo === null:そのデバイスでサインアウトして、デバイスにトークンがないとき
            //2.currentUserInfo.username(などユーザーに関するプロパティ) === undefined: 別のデバイスでサインアウトして、そのデバイスにトークンはあるが、アクセストークンが無効なとき
            if(currentUserInfo === null || currentUserInfo.username === undefined){
                //ログイン画面に飛ばす処理
            }
        })
        .catch(err=> {
            console.log(err)
            //currentUserInfoが取得できないときはログイン画面に飛ばす。
            //ログイン画面に飛ばす処理
        })
    
    그게 다야.
    각 시트의 드로잉에 대해 위의 작업을 수행하는 경우
    Id 토큰이 유효해도
    이 장치에 서명할 뿐만 아니라 다른 장치에 서명할 것인지도 확인할 수 있다.
    제 방법이 유일한 해결 방법이 아니라고 생각합니다. 다른 방안과 개선 방안이 있다면 꼭 공유해 주십시오!
    끝맺다
    공식적인 견해
    사실 signOut({global:true}) 문서 행위가 없는 문제는 현재 오픈의 issue가 되었다.
    cognito.user.signOut() does not invalidate tokens
    이 issue는 2019년 6월 오픈으로 아직 close가 없습니다.이 issue 이외에 같은 일에 관한 issue도 몇 가지 있다.
    사용자 중 한 명메모이 AWS에 문의했을 때의 답변을 믿으면 AWS 측이 이를 인정하고 현재 노력하고 있다.

    나는 다음 중 어느 것이 언제 실현될 수 있으면 좋겠다고 생각한다.가능하면 전자야.
  • 전역 서명에서 id 영패는 즉시 비활성화되고session 함수는 로컬 저장된 영패의 유효기간이 아닌cognito에 유효한지 확인합니다
  • Cognito 접속 영패가 유효한지 묻는 함수 생성
  • 좋은 웹페이지 즐겨찾기