Firebase Authentication Custom Token 획득 및 사용
15268 단어 Firestore
요점은 무엇인가 식별 ID가 되는 문자열을 건네주면 그것에 대응한 token이 돌아온다. 그 후는 그 token을 이용해 로그인하면 된다.
획득
우선 token 취득. admin 권한이 필요합니다.
hogehoge가 되고 있는 곳, 기존의 인증 시스템에서의 ID로 하면 된다.
여기를 Provider:userId라고 부르면 여러가지 편리하다.
getToken.js
const admin = require('firebase-admin');
const serviceAccount = require('path/to/key.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://staging-xxxxx.firebaseio.com',
});
admin.auth().createCustomToken('hogehoge')
.then(token => {
console.log(token);
})
.catch(e => {
console.log(e);
});
상기 프로그램을 실행하면 아래와 같은 응답. 이것이 token.
node getToken.js
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsImlhdCI6MTU3NTkyNDIwNSwiZXhwIjoxNTc1OTI3ODA1LCJpc3MiOiJmaXJlYmFzZS1hZG1pbnNkay12YW9lYkBzdGFnaW5nLWE1OTQ2LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic3ViIjoiZmlyZWJhc2UtYWRtaW5zZGstdmFvZWJAc3RhZ2luZy1hNTk0Ni5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInVpZCI6ImhvZ2Vob2dlIn0.BuY23mqh26evnsN7Rh_0QkugBTpL0992P763P_n9fcYPHsTWz-VzHKqXMOviITSLFPNNiDXRcFPsPGYmfwaOcIrW8QfgNtfF12coymqK16XeqOkZEHlj-TLqxuMMRIkoZcDW6PcYsYVel_hplYOzuKD5hvNiHiNv8jQKRsLq2EbVGeOCizS0CCVK_6GsB34QUTsHp717vO6Ek2L0IPRijil9xRunCnYh2Tjz-PdyZ3H2eY6iqM7YW0qZ32TjfhEvGpJxabCKMrHmOlh4WZIxINO43fI17Kln45wniVaDN0zKt1sG1StdVXVcbD0wAX8cZl6JpP347nCskPxxxxxxxx
DB에 계정과 연결하여 token을 저장해두고 이용한다.
token의 유효기간은 1시간이므로 db에 저장할 때까지도 없을지도 (어떻게 refresh하는지 문제는 있다).
사용
이용은 클라이언트측.
상기에서 취득한 token을 이용.
authClient
const firebase = require('firebase');
const firebaseConfig = {
apiKey: "AIzaSyD7HtQGZhfL4T1ttrElxsgDwqoxxxxxxxx",
authDomain: "test-xxxxx.firebaseapp.com",
databaseURL: "https://test-xxxxx.firebaseio.com",
projectId: "test-xxxxx",
storageBucket: "test-xxxxx.appspot.com",
messagingSenderId: "250622200000",
appId: "1:250622212741:web:ff33a2e77b61e8990xxxxx",
measurementId: "G-VVQ2BXXXXX"
};
firebase.initializeApp(firebaseConfig);
const token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsImlhdCI6MTU3NTkyNDIwNSwiZXhwIjoxNTc1OTI3ODA1LCJpc3MiOiJmaXJlYmFzZS1hZG1pbnNkay12YW9lYkBzdGFnaW5nLWE1OTQ2LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic3ViIjoiZmlyZWJhc2UtYWRtaW5zZGstdmFvZWJAc3RhZ2luZy1hNTk0Ni5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInVpZCI6ImhvZ2Vob2dlIn0.BuY23mqh26evnsN7Rh_0QkugBTpL0992P763P_n9fcYPHsTWz-VzHKqXMOviITSLFPNNiDXRcFPsPGYmfwaOcIrW8QfgNtfF12coymqK16XeqOkZEHlj-TLqxuMMRIkoZcDW6PcYsYVel_hplYOzuKD5hvNiHiNv8jQKRsLq2EbVGeOCizS0CCVK_6GsB34QUTsHp717vO6Ek2L0IPRijil9xRunCnYh2Tjz-PdyZ3H2eY6iqM7YW0qZ32TjfhEvGpJxabCKMrHmOlh4WZIxINO43fI17Kln45wniVaDN0zKt1sG1StdVXVcbD0wAX8cZl6JpP347nCskPxxxxxxxx";
firebase.auth().signInWithCustomToken(token)
.then(res => {
console.log(res.user.uid);
res.user.updateEmail("[email protected]"); //emailを設定
})
.catch(e => {
console.log(e);
})
실행하면 로그인할 수 있다.
node authClient
Authentication UI에서 보면 아래와 같은 느낌.
기타
token의 refresh를 어떻게합니까?
여러 곳에서 논의되고 있지만 명확한 대답이 없다. 최악, 한번 사용자를 delete하고, 다시 create하면 좋겠지만. . .
계속 조사.
추가
create 했을 때에 token 밖에 돌아오지 않으므로, 어떻게 refresh 하면 좋을까? 라는 의문이 있었습니다만, 로그인했을 때에 user 정보에 refresh_token 정보가 포함되어 있으므로 그것을 저장해 두고 이용하는 느낌인 것 같다.
하지만 상기 토큰의 유효기간 자체가 1시간이므로 1시간 이내에 그 처리를 할 필요가 있다.
아래와 같이 로그인시에 refreshToken을 출력.
firebase.auth().signInWithCustomToken(token)
.then(res => {
console.log(res.user.uid);
console.log(res.user.refreshToken);
})
.catch(e => {
console.log(e);
})
그리고 아래와 같이 refreshToken을 이용하여 새로운 token을 요구한다.
const firebase = require('firebase');
const axios = require('axios');
const firebaseConfig = {
apiKey: "AIzaSyD7HtQGZhfL4T1ttrElxsgDwqoxxxxxxxx",
authDomain: "test-xxxxx.firebaseapp.com",
databaseURL: "https://test-xxxxx.firebaseio.com",
projectId: "test-xxxxx",
storageBucket: "test-xxxxx.appspot.com",
messagingSenderId: "250622200000",
appId: "1:250622212741:web:ff33a2e77b61e8990xxxxx",
measurementId: "G-VVQ2BXXXXX"
};
firebase.initializeApp(firebaseConfig);
//上記で取得したリフレッシュToken
const refreshToken = "AEu4IL24RUu8heim0A2kn4U_Yk5lJy1-a7pdDapK08OFUDOA1hoH7oxzoa5Yb9Vafb4SpH8pVUtza4KfyvZZ2IF-r-dIpAXM9B8cnw-k_bXXXXXXXXX-XXXX";
//postパラメータを設定
const params = new URLSearchParams();
params.append('grant_type', 'refresh_token');
params.append('refresh_token', refreshToken);
//リクエスト
axios.post('https://securetoken.googleapis.com/v1/token?key=' + firebaseConfig.apiKey, params)
.then(res => {
// console.log(res.data.access_token);
console.log(res);
})
.catch(e => {
console.log(e);
})
admin.auth().revokeRefreshTokens('UID');
Reference
이 문제에 관하여(Firebase Authentication Custom Token 획득 및 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zaburo/items/92920fa955bdb890c52e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)