回答:
ユーザーがログインしpassport.js
ているuser
場合、req
はすべてのリクエストに対してオブジェクトを作成しますexpress.js
。これにより、任意のミドルウェアに存在するかどうかを確認できます。
if (req.user) {
// logged in
} else {
// not logged in
}
express.js
そのための簡単なミドルウェアを作成できます。これにより、ユーザーがログインしているかどうかがチェックされ、ログインしていない場合は/login
ページにリダイレクトされます。
function loggedIn(req, res, next) {
if (req.user) {
next();
} else {
res.redirect('/login');
}
}
そしてそれを使う:
app.get('/orders', loggedIn, function(req, res, next) {
// req.user - will exist
// load user orders and render them
});
app.get
、app.post
などの高速ルートミドルウェアハンドラ内にのみ存在します。別の機能が必要な場合は、質問の詳細と達成しようとしていることを説明する必要があります。
コードサンプルが次のようなミドルウェアを作成できることを示しているように、テンプレートで使用したい場合:
app.use(function (req, res, next) {
res.locals.login = req.isAuthenticated();
next();
});
パスポートをセットアップした後、どこかにそのコードを配置します。
そして、それをテンプレートで使用します(swigの例)
{% if login %}
<button>logout</button>
{% else %}
<button>login</button>
{% endif %}
app.use(function(req,res,next){
res.locals.login = req.isAuthenticated();
res.locals.user = req.user;
next();
});
isAuthenticated
、次のリクエストでfalseを返します。あなたはこの質問に答える助けてもらえstackoverflow.com/questions/42842171/...
明示的に文書化されていませんが、passportによってisAuthenticated()
挿入さreq
れるメソッドがあります。
次のように使用できます。
req.isAuthenticated() // returns true if auth, false if not
// auth.js
module.exports = {
ensureAuthenticated: (req, res, next) => {
if (req.isAuthenticated()) {
return next()
}
res.redirect('/login') // if not auth
},
forwardAuthenticated: (req, res, next) => {
if (!req.isAuthenticated()) {
return next()
}
res.redirect('/dashboard'); // if auth
}
}
// app.js
app.get('/dashboard', ensureAuthenticated, (req, res) => res.render('dashboard'))
app.get('/login', forwardAuthenticated, (req, res) => res.render('login'))
app.get('/register', forwardAuthenticated, (req, res) => res.render('register'))
私はそのような解決策を探していて、このページに出くわしました。質問は、クライアント側でログインステータスを確認する方法です。
ログインした後、「ログイン」ボタンを非表示にし、「ログアウト」ボタンを表示します。ページの更新時に、ログアウトボタンの代わりにログインボタンが再び表示されます。唯一の解決策は、セッションを使用している場合はsessionStorage(およびJWTを使用している場合はlocalStorage)にアイテムを保存することです。ログアウト時に削除してください。次に、すべてのページの読み込みで、このsessionStorageアイテムを確認し、それに応じて行います。
if (sessionStorage.getItem('status')) {
$("#btnlogout").show();
$("#btnlogin").hide();
// or what ever you want to do
} else {
$("#btnlogout").hide();
$("#btnlogin").show();
}
function Login() {
var data = {
username: $("#myModal #usr").val(),
password: $("#myModal #pw").val()
};
$.ajax({
type: 'POST',
url: '/login',
contentType: 'application/JSON; charset=utf-8',
data: JSON.stringify(data),
success: funcSuccess,
error: funcFail
});
function funcSuccess(res) {
sessionStorage.setItem('status', 'loggedIn');
$("#btnlogout").show();
$("#btnlogin").hide();
}
function funcFail() { $("#pp").text('Login Failed'); };
};
function Logout() {
$.ajax({
type: 'GET',
url: '/logout',
contentType: 'application/JSON; charset=utf-8',
success: funcSuccess,
error: funcFail,
});
function funcSuccess(res) {
$("#btnlogout").hide();
$("#btnlogin").show();
sessionStorage.removeItem("status");
};
function funcFail() { alert('Login method Failed'); };
};
良い質問です。このようなものを実装しようとしたときにいくつかの問題がありました。認証されていないリクエストがあると、res.locals変数が偽の値を返す場合、ハンドルバーがifブロックをスキップします。この問題を解決するには、ミドルウェアをapp.jsファイルに設定して、req.userをアプリでグローバルに使用できるようにする必要があります。
app.use(function (req, res, next) {
res.locals.login = req.user;
next();
});
ヘッダーファイルでは、認証されたユーザーに対してこのチェックを実行し、それに応じてコンテンツを表示できます。
{{#if login }}
<li><a href="#">User Account</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Logout</a></li>
{{/if}}
{{#unless login}}
<li><a href="#">Sign up</a></li>
<li><a href="#">Sign in</a></li>
{{/unless}}