/** * personium.io * Copyright 2014 FUJITSU LIMITED * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fujitsu.dc.test.jersey.cell.auth; import org.apache.http.HttpStatus; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import com.fujitsu.dc.test.categories.Integration; import com.fujitsu.dc.test.categories.Regression; import com.fujitsu.dc.test.categories.Unit; import com.fujitsu.dc.test.jersey.AbstractCase; import com.fujitsu.dc.test.jersey.DcRunner; import com.fujitsu.dc.test.utils.AccountUtils; import com.fujitsu.dc.test.utils.Http; import com.sun.jersey.test.framework.JerseyTest; /** * OpenID Connect認証のテスト. * 正常系のテストには、有効なIDTokenをリアルタイムで取得する必要があるため、 * V1.3.24での実装では、ダミーのIDTokenを用いた異常系のみに限定する. * 検証可能なIDTokenを用いた異常系のテストも同様に未実装. * <TODO>: 正常系テスト */ @RunWith(DcRunner.class) @Category({Unit.class, Integration.class, Regression.class }) public class AuthOidcTest extends JerseyTest { static final String OIDC_PROVIDER_GOOGLE = "google"; static final String TEST_CELL1 = "testcell1"; static final String JWT_DUMMY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIi" + "wiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"; static final String ID_TOKEN_DUMMY = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiYzZhY2ZhNjFhZGIyMDhjYTk1MjRhNzdlMGNiMTM0OTFkZWM4NDMifQ." + "eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXRfaGFzaCI6InBKYUd5YThjamhqRzNjcnpvVVR0NFEiLCJ" + "hdWQiOiI3NTkyNjQ5MjE2MzItNHZqYzc3czc4aDZzajA5cHJmYWIyMmc4OHRtMnBwMDEuYXBwcy5nb29nbGV1c2" + "VyY29udGVudC5jb20iLCJzdWIiOiIxMDc2Mjk5NDI0NjkwMDQ5OTM4MTEiLCJlbWFpbF92ZXJpZmllZCI6dHJ1Z" + "SwiYXpwIjoiNzU5MjY0OTIxNjMyLTR2amM3N3M3OGg2c2owOXByZmFiMjJnODh0bTJwcDAxLmFwcHMuZ29vZ2xl" + "dXNlcmNvbnRlbnQuY29tIiwiZW1haWwiOiJwZXJzb25pdW0uaW9AZ21haWwuY29tIiwiaWF0IjoxNDYxMzEzNTg" + "4LCJleHAiOjE0NjEzMTcxODgsIm5hbWUiOiJwZXJzb25pdW0gaW8iLCJnaXZlbl9uYW1lIjoicGVyc29uaXVtIi" + "wiZmFtaWx5X25hbWUiOiJpbyIsImxvY2FsZSI6ImphIn0.NRFBcCk6-rdzwftnKefXOzOWJTtBiZScOz4QArh1B" + "ghI9H3f_cONu57SRzPatxbpF7J5-DKWFo9K-T4XNUMD5VgBU3wpvar2ZqZTLOH7yZV_ngxGchSLuITPJRR59yrY" + "gmbbjC0Ke5J-shUjb_x39zhAtVMePJRFIpcozzf7Mdz9-HV_nkFEPJkrFdcnPBhxP97GaKUaMjRv41OPoQxfBLW" + "2V9HodvgM2RxAYN1zfmWNyGSl84x13NmxEHC8Q9CC6jCsG9p8R-fRF2f_LtD3yIUPuvyNgRErmip7aZiVo40Gle" + "txATXXihKG8nE2onz9zCpMXd2gYJ4vt7b_7vNktg"; static final String INVALID_TOKEN = "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiYzZhY2ZhNjFhZGIymDhjYTk1mjRhNzdlmGNimTm0OTFkZWm4NDmifQ." + "eyJpc3miOiJhY2NvdW50cy5Nb29NbGUuY29tIiwiYXRfaGFzaCI6INBKYUd5YThjamhqRzNjcNpvVVR0NFEiLCJ" + "hdWQiOiI3NTkyNjQ5mjE2mzItNHZqYzc3czc4aDZzajA5cHJmYWIymmc4OHRtmNBwmDEuYXBwcy5Nb29NbGV1c2" + "VyY29udGVudC5jb20iLCJzdWIiOiIxmDc2mjk5NDI0NjkwmDQ5OTm4mTEiLCJlbWFpbF92ZXJpZmllZCI6dHJ1Z" + "SwiYXpwIjoiNzU5mjY0OTIxNjmyLTR2amm3N3m3OGg2c2owOXByZmFimjJNODh0bTJwcDAxLmFwcHmuZ29vZ2xl" + "dXNlcmNvbNRlbNQuY29tIiwiZW1haWwiOiJwZXJzb25pdW0uaW9AZ21haWwuY29tIiwiaWF0IjoxNDYxmzEzNTg" + "4LCJleHAiOjE0NjEzmTcxODgsIm5hbWUiOiJwZXJzb25pdW0gaW8iLCJNaXZlbl9uYW1lIjoicGVyc29uaXVtIi" + "wiZmFtaWx5X25hbWUiOiJpbyIsImxvY2FsZSI6ImphIN0.NRFBcCk6-rdzwftNKefXOzOWJTtBiZScOz4QArh1B" + "ghI9H3f_cONu57SRzPatxbpF7J5-DKWFo9K-T4XNUmD5VgBU3wpvar2ZqZTLOH7yZV_NgxGchSLuITPJRR59yrY" + "gmbbjC0Ke5J-shUjb_x39zhAtVmePJRFIpcozzf7mdz9-HV_NkFEPJkrFdcNPBhxP97GaKUamjRv41OPoQxfBLW" + "2V9Hodvgm2RxAYN1zfmWNyGSl84x13NmxEHC8Q9CC6jCsG9p8R-fRF2f_LtD3yIUPuvyNgRErmip7aZiVo40Gle" + "txATXXihKG8NE2oNz9zCpmXd2gYJ4vt7b_7vNktg"; /** * コンストラクタ. */ public AuthOidcTest() { super("com.fujitsu.dc.core.rs"); } /** * 不正なIDTokenを指定し400エラーが返却されること. * @throws InterruptedException 待機失敗 */ @Test public final void 不正なIDTokenを指定し400エラーが返却されること() throws InterruptedException { String accountName = "invalidIdTokenAccount"; try { // テスト用のアカウントを作成 // 他のテストと共用するAccountを使用すると、認証失敗のロックがかかり、テストが失敗する。このため、このテスト独自のAccountを作成する AccountUtils.createNonCredentialWithType(AbstractCase.MASTER_TOKEN_NAME, TEST_CELL1, accountName, "oidc:google", HttpStatus.SC_CREATED); Http.request("authn/oidc-auth.txt") .with("remoteCell", TEST_CELL1) .with("id_provider", OIDC_PROVIDER_GOOGLE) .with("id_token", "hogefugatest") .returns().statusCode(HttpStatus.SC_BAD_REQUEST); } finally { AccountUtils.delete(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, accountName, HttpStatus.SC_NO_CONTENT); } } /** * JWT形式の不正なIDTokenを指定し400エラーが返却されること. * @throws InterruptedException 待機失敗 */ @Test public final void JWT形式の不正なIDTokenを指定し400エラーが返却されること() throws InterruptedException { String accountName = "invalidJWTIdTokenAccount"; try { // テスト用のアカウントを作成 // 他のテストと共用するAccountを使用すると、認証失敗のロックがかかり、テストが失敗する。このため、このテスト独自のAccountを作成する AccountUtils.createNonCredentialWithType(AbstractCase.MASTER_TOKEN_NAME, TEST_CELL1, accountName, "oidc:google", HttpStatus.SC_CREATED); Http.request("authn/oidc-auth.txt") .with("remoteCell", TEST_CELL1) .with("id_provider", OIDC_PROVIDER_GOOGLE) .with("id_token", JWT_DUMMY) .returns().statusCode(HttpStatus.SC_BAD_REQUEST); } finally { AccountUtils.delete(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, accountName, HttpStatus.SC_NO_CONTENT); } } /** * 有効期限切れのIDTokenを指定し400エラーが返却されること. * @throws InterruptedException 待機失敗 */ @Test public final void 有効期限切れのIDTokenを指定し400エラーが返却されること() throws InterruptedException { String accountName = "expiredIdTokenAccount"; try { // テスト用のアカウントを作成 // 他のテストと共用するAccountを使用すると、認証失敗のロックがかかり、テストが失敗する。このため、このテスト独自のAccountを作成する AccountUtils.createNonCredentialWithType(AbstractCase.MASTER_TOKEN_NAME, TEST_CELL1, accountName, "oidc:google", HttpStatus.SC_CREATED); Http.request("authn/oidc-auth.txt") .with("remoteCell", TEST_CELL1) .with("id_provider", OIDC_PROVIDER_GOOGLE) .with("id_token", ID_TOKEN_DUMMY) .returns().statusCode(HttpStatus.SC_BAD_REQUEST); } finally { AccountUtils.delete(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, accountName, HttpStatus.SC_NO_CONTENT); } } /** * デコードできないJWT形式の不正なIDTokenを指定し400エラーが返却されること. * @throws InterruptedException 待機失敗 */ @Test public final void デコードできないJWT形式の不正なIDTokenを指定し400エラーが返却されること() throws InterruptedException { String accountName = "invalidIdTokenAccount"; try { // テスト用のアカウントを作成 // 他のテストと共用するAccountを使用すると、認証失敗のロックがかかり、テストが失敗する。このため、このテスト独自のAccountを作成する AccountUtils.createNonCredentialWithType(AbstractCase.MASTER_TOKEN_NAME, TEST_CELL1, accountName, "oidc:google", HttpStatus.SC_CREATED); Http.request("authn/oidc-auth.txt") .with("remoteCell", TEST_CELL1) .with("id_provider", OIDC_PROVIDER_GOOGLE) .with("id_token", INVALID_TOKEN) .returns().statusCode(HttpStatus.SC_BAD_REQUEST); } finally { AccountUtils.delete(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, accountName, HttpStatus.SC_NO_CONTENT); } } }