[AWSxAmplifyxCognito] Amplify 글로벌 신호 출력이 글로벌 신호를 주지 않는 문제에 대한 응급 처리
안녕하세요!
인증 기능이 구현된 경우 다른 장치에 서명한 후 사용자가 로그인한 모든 다른 장치에서 로그아웃하려는 경우가 있죠?
Amplify의 요구를 충족시키기 위해
singOut
함수에 글로벌 옵션이 있습니다. signOut({global:true})
처럼 서명할 때 사용자가 가지고 있는 모든 영패가 무효화되어 모든 장치에서 서명할 수 있습니다.아래문서에서 발췌하다
문서에 이렇게 쓰여 있으면 실제로 사용자가 인증 후 취득한 3가지 영패 중 방문 영패와 갱신 영패는 즉시 무효가 된다
사실
signOut({global:true})
ID 영패를 만들어도 무효가 되지 않습니다!또한 세션을 확인하는 함수
currentSession
,userSession
는 코그니토에 유효한 접근 영패와 갱신 영패를 문의하지 않고 로컬 저장 장치의 Id 영패의 유효기간만 확인한다.currentSession
, userSession
함수에서 한 장치에서 전역 서명을 해도 다른 장치에서는 Id 토큰이 만료되지 않는 한 사용자가'세션 끊기'로 판단되지 않는다는 것이다.대응 정책: 실행 중 접근 영패의 함수를 사용하여 세션 중단을 확인합니다
currentSession
, userSession
함수는 영패 접속과 영패 리셋이 유효한지 검사하지 않습니다.그러면 유효한지 물어보는 함수를 사용하면 되지만 확인하는 함수만 Amplify 참조에서 찾을 수 없습니다.
따라서 실행할 때 액세스 영패의 함수를 사용하여 유효성과 무효성을 확인합니다.
예를 들어
currentUserInfo
함수는 이와 같다.이 함수는,
{
"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 측이 이를 인정하고 현재 노력하고 있다.
나는 다음 중 어느 것이 언제 실현될 수 있으면 좋겠다고 생각한다.가능하면 전자야.
Reference
이 문제에 관하여([AWSxAmplifyxCognito] Amplify 글로벌 신호 출력이 글로벌 신호를 주지 않는 문제에 대한 응급 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/iron-samurai/items/28f7d4de214fbf92dd4f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)