2017-11-28 2 views
0

react/express + jwtウェブページのthis auth0チュートリアルに従っています。JWTなぜ認証をバイパスできますか?

すべては問題ありません。ログイン/ログアウト、セキュリティで保護されたページにアクセスする

私はログインを偽のトークンでバイパスすることができます。私がjwt.ioに行ってまだ期限切れではないトークンを生成すれば、実際にログインすることなく安全なページにアクセスできます。ここでは何が分かりませんか?

これは認証を処理するコードの一部です:

./utils/AuthService.js 
const ID_TOKEN_KEY = 'id_token'; 
const ACCESS_TOKEN_KEY = 'access_token'; 

const CLIENT_ID = 'auht0 client id'; 
const CLIENT_DOMAIN = 'foo.eu.auth0.com'; 
const REDIRECT = 'http://localhost:3000/callback'; 
const SCOPE = 'openid profile '; 
const AUDIENCE = 'https://foo.eu.auth0.com/api/v2/'; 

var auth = new auth0.WebAuth({ 
    clientID: CLIENT_ID, 
    domain: CLIENT_DOMAIN 
}); 

export function login() { 
    auth.authorize({ 
    responseType: 'token id_token', 
    redirectUri: REDIRECT, 
    audience: AUDIENCE, 
    scope: SCOPE 
    }); 
} 

export function logout() { 
    clearIdToken(); 
    clearAccessToken(); 
    browserHistory.push('/'); 
} 

export function requireAuth(nextState, replace) { 
    if (!isLoggedIn()) { 
    replace({pathname: '/'}); 
    } 
} 

export function getIdToken() { 
    return localStorage.getItem(ID_TOKEN_KEY); 
} 

export function getAccessToken() { 
    return localStorage.getItem(ACCESS_TOKEN_KEY); 
} 

function clearIdToken() { 
    localStorage.removeItem(ID_TOKEN_KEY); 
} 

function clearAccessToken() { 
    localStorage.removeItem(ACCESS_TOKEN_KEY); 
} 

// Helper function that will allow us to extract the access_token and id_token 
function getParameterByName(name) { 
    let match = RegExp('[#&]' + name + '=([^&]*)').exec(window.location.hash); 
    return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); 
} 

// Get and store access_token in local storage 
export function setAccessToken() { 
    let accessToken = getParameterByName('access_token'); 
    localStorage.setItem(ACCESS_TOKEN_KEY, accessToken); 
} 

// Get and store id_token in local storage 
export function setIdToken() { 
    let idToken = getParameterByName('id_token'); 
    localStorage.setItem(ID_TOKEN_KEY, idToken); 
} 

export function isLoggedIn() { 
    const idToken = getIdToken(); 
    return !!idToken && !isTokenExpired(idToken); 
} 

function getTokenExpirationDate(encodedToken) { 
    const token = decode(encodedToken); 
    if (!token.exp) { return null; } 

    const date = new Date(0); 
    date.setUTCSeconds(token.exp); 

    return date; 
} 

function isTokenExpired(token) { 
    const expirationDate = getTokenExpirationDate(token); 
    return expirationDate < new Date(); 
} 

答えて

2

あなただけの店を掲載しましたパーツ/ローカルストレージからトークンを取得します。 認証自体は、サーバ側で処理される

secret: jwks.expressJwtSecret({ 
     cache: true, 
     rateLimit: true, 
     jwksRequestsPerMinute: 5, 
     // YOUR-AUTH0-DOMAIN name e.g prosper.auth0.com 
     jwksUri: "https://{YOUR-AUTH0-DOMAIN}/.well-known/jwks.json" 
    }), 
    // This is the identifier we set when we created the API 
    audience: '{YOUR-API-AUDIENCE-ATTRIBUTE}', 
    issuer: '{YOUR-AUTH0-DOMAIN}', 
    algorithms: ['RS256'] 
}); 

サーバ側funtionalityはJWTトークンの署名をチェックしなければなりません。秘密鍵がなければ、JWTトークンの有効な署名を生成することができません。

本当に認証をバイパスできれば、サーバーに重大なセキュリティ上の問題があることを意味します(署名が正しく検証されていない)。テスト/デモサービスのために実装されていない可能性があります。

+0

したがって、サーバーから情報は取得されませんが、反応/フロントエンドのセキュアページにはまだアクセスでき、サーバーによって送信されていないコンテンツが表示されます。 – Trax

+0

トークンはバックエンドサービスにのみアクセスすることを目的としています。必要に応じて基本的なユーザー情報(クレーム)をクライアントに提供します。クライアントアプリケーションはアクセス可能ですが、バックエンドサービスに対して認証されていないユーザー(ビジネス)のコンテンツをバックエンドから取得/表示することはできません。 – gusto2