Firebase Authentication Custom Token 획득 및 사용

15268 단어 Firestore
기존의 인증 시스템이나 표준 프로바이더가 없는 경우에 이용할 수 있는 것이 custom token에 의한 인증.
요점은 무엇인가 식별 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);
    })
  • refreshtoken은 expire하지 않는 것 같습니다
  • revokeRefreshToken ()을 호출하는 것 같습니다.
    admin.auth().revokeRefreshTokens('UID');
    
  • 좋은 웹페이지 즐겨찾기