Contents
はじめに
拙稿の続き。
問題はこの後。ログイン済のアカウントが自身の個人情報をアップデートする場合にアカウントの再認証が求められるのだそうです。
この辺を対応します。なお利用するソースコードはこちら。
対応を進めましょう
document.getElementByID()の記述を、長ぇよ!と思いw
jQueryの$(‘#{ID名称}’)の記述が気に入っていたので、自身で作ったfunctionがあります。
https://github.com/mayarin/firebase-sample

まずニックネームの変更。

ここは容易いです。
なお該当箇所のソースコード。
<!--html-->
<form id='update_form'>
<h2>プロフィール更新</h2>
<div class="form-group">
<input type="text" class="form-control col-4" id='update_displayName' placeholder='ニックネーム...'/>
</div>
<div class="form-group">
<button class="btn btn-primary" type='submit'>反映</button>
</div>
</form>// javascript
document.querySelector("#update_form").addEventListener("submit", function(event) {
var user = firebase.auth().currentUser;
user.updateProfile({
displayName : getElementValue('update_displayName')
}).then(function() {
alert('ニックネームを変更しました。');
location.reload();
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
event.preventDefault();
}, false);引き続きメールアドレスの変更の実装を行います。
こちらはログイン情報に直結するので認証が厳重みたいです…
<form id='update_mailaddress_form'>
<h2>メールアドレス変更</h2>
<div class="form-group">
<input type="email" class="form-control col-4" id='update_email' placeholder='新しいメールアドレス...'/>
</div>
<div class="form-group">
<button class="btn btn-primary" type='submit'>反映</button>
</div>
</form>document.querySelector("#update_mailaddress_form").addEventListener("submit", function(event) {
var user = firebase.auth().currentUser;
user.updateEmail(getElementValue('update_email')).then(function() {
alert('メールアドレスを変更しました。');
location.reload();
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
event.preventDefault();
}, false);auth/requires-recent-login, This operation is sensitive and requires recent authentication. Log in again before retrying this request.
そうそう、こういう叱られ方するんです。
https://firebase.google.com/docs/auth/web/manage-users#re-authenticate_a_use
firebase authではユーザーの再認証を求められるので、そちらが取れているか確認します。
document.querySelector("#update_mailaddress_form").addEventListener("submit", function(event) {
var user = firebase.auth().currentUser;
var credential;
// Prompt the user to re-provide their sign-in credentials
user.reauthenticateWithCredential(credential).then(function() {
// User re-authenticated.
alert('ok');
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
event.preventDefault();
}, false);上記ソースで走らせたら「auth/argument-error」「reauthenticateWithCredential failed: First argument “credential” must be a valid credential.」と叱られました。

こうして…
<form id='update_mailaddress_form'>
<h2>メールアドレス変更</h2>
<div class="form-group">
<input type="email" class="form-control col-4" id='update_now_email' placeholder='現在のメールアドレス...'/>
</div>
<div class="form-group">
<input type="email" class="form-control col-4" id='update_new_email' placeholder='新しいメールアドレス...'/>
</div>
<div class="form-group">
<input type="password" class="form-control col-4" id='update_email_password' placeholder='パスワード...'/>
</div>
<div class="form-group">
<button class="btn btn-primary" type='submit'>反映</button>
</div>
</form>document.querySelector("#update_mailaddress_form").addEventListener("submit", function(event) {
var user = firebase.auth().currentUser;
var credential = firebase.auth.EmailAuthProvider.credential(
getElementValue('update_now_email'),
getElementValue('update_email_password')
);
user.reauthenticateWithCredential(credential).then(function() {
// User re-authenticated.
alert('ok');
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
event.preventDefault();
}, false);こうして…OKがもらえた。ならば完遂させてみる。
さっき避けていたupdateEmailを戻してきて、反映。
document.querySelector("#update_mailaddress_form").addEventListener("submit", function(event) {
var user = firebase.auth().currentUser;
var credential = firebase.auth.EmailAuthProvider.credential(
getElementValue('update_now_email'),
getElementValue('update_email_password')
);
user.reauthenticateWithCredential(credential).then(function() {
// User re-authenticated.
user.updateEmail(getElementValue('update_new_email')).then(function() {
alert('メールアドレスを変更しました。');
location.reload();
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
}).catch(function(error) {
var errorCode = error.code;
var errorMessage = error.message;
alert(errorCode + ', ' + errorMessage);
});
event.preventDefault();
}, false);よし通った。現在のメールアドレスはuserから取ればいいから削除。
同様にパスワードの変更、アカウント削除を実装します。
バリデートはそのうち実装します。
なおプロフィール画像のアップロードはFirebase Strageを使おうと思うので、次の項目に回します。