/**
* 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.token;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.http.HttpStatus;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import com.fujitsu.dc.common.auth.token.AbstractOAuth2Token;
import com.fujitsu.dc.common.auth.token.AccountAccessToken;
import com.fujitsu.dc.common.auth.token.CellLocalAccessToken;
import com.fujitsu.dc.common.auth.token.CellLocalRefreshToken;
import com.fujitsu.dc.common.auth.token.Role;
import com.fujitsu.dc.common.auth.token.TransCellAccessToken;
import com.fujitsu.dc.common.auth.token.TransCellRefreshToken;
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.DcRunner;
import com.fujitsu.dc.test.setup.Setup;
import com.fujitsu.dc.test.unit.core.UrlUtils;
import com.fujitsu.dc.test.utils.Http;
import com.fujitsu.dc.test.utils.ResourceUtils;
import com.sun.jersey.test.framework.JerseyTest;
/**
* トークンのテスト.
*/
@RunWith(DcRunner.class)
@Category({Unit.class, Integration.class, Regression.class })
public class TokenTest extends JerseyTest {
static final String TEST_CELL1 = "testcell1";
static final String TEST_CELL2 = "testcell2";
static final String TEST_APP_CELL1 = "schema1";
static final String DAV_COLLECTION = "setdavcol/";
static final String DAV_RESOURCE = "dav.txt";
static final int MILLISECS_IN_AN_MINITE = 60 * 1000;
/**
* コンストラクタ.
*/
public TokenTest() {
super("com.fujitsu.dc.core.rs");
}
/**
* トークン認証_トランスセルトークンの期限が切れていたら認証エラーになること.
*/
@Test
public final void トークン認証_トランスセルトークンの期限が切れていたら認証エラーになること() {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = issuer + "#account1";
String target = UrlUtils.cellRoot(TEST_CELL2);
List<Role> roleList = new ArrayList<Role>();
String schema = "";
// 期限切れでないトークンを生成
TransCellAccessToken validToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR + MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// セルに対してトークン認証
Http.request("authn/saml-cl-c0.txt")
.with("remoteCell", TEST_CELL2)
.with("assertion", validToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_OK);
// 期限切れのトークンを生成
TransCellAccessToken invalidToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR - MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// セルに対してトークン認証
Http.request("authn/saml-cl-c0.txt")
.with("remoteCell", TEST_CELL2)
.with("assertion", invalidToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_BAD_REQUEST);
}
/**
* リフレッシュトークン認証_パスワード認証時に払い出されたリフレッシュトークン期限切れの場合認証エラーになること.
*/
@Test
public final void リフレッシュトークン認証_パスワード認証時に払い出されたリフレッシュトークン期限切れの場合認証エラーになること() {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = issuer + "#account1";
String schema = "";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
CellLocalRefreshToken validToken = new CellLocalRefreshToken(
issuedAt - AbstractOAuth2Token.SECS_IN_AN_DAY * 1000 + MILLISECS_IN_AN_MINITE,
issuer, subject, schema);
// アプリセルに対して認証
Http.request("authn/refresh-cl.txt")
.with("remoteCell", TEST_CELL1)
.with("refresh_token", validToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_OK);
// 期限切れのトークンを生成する(IT環境の通信時間を考慮して1分余裕を持たせる)
CellLocalRefreshToken invalidToken = new CellLocalRefreshToken(
issuedAt - AbstractOAuth2Token.SECS_IN_AN_DAY * 1000 - MILLISECS_IN_AN_MINITE, issuer, subject, schema);
// アプリセルに対して認証
Http.request("authn/refresh-cl.txt")
.with("remoteCell", TEST_CELL1)
.with("refresh_token", invalidToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_BAD_REQUEST);
}
/**
* リフレッシュトークン認証_トークン認証時に払い出されたリフレッシュトークンの期限切れの場合認証エラーになること.
*/
@Test
public final void リフレッシュトークン認証_トランスセル認証リフレッシュトークン期限切れのテスト() {
String id = "";
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL2);
String origIssuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = origIssuer + "#account1";
List<Role> origRoleList = new ArrayList<Role>();
String schema = "";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellRefreshToken validToken = new TransCellRefreshToken(
id, issuedAt - AbstractOAuth2Token.SECS_IN_AN_DAY * 1000 + MILLISECS_IN_AN_MINITE,
issuer, subject, origIssuer, origRoleList, schema);
// Refresh
Http.request("authn/refresh-cl.txt")
.with("remoteCell", TEST_CELL2)
.with("refresh_token", validToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_OK);
// 期限切れのトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellRefreshToken invalidToken = new TransCellRefreshToken(
id, issuedAt - AbstractOAuth2Token.SECS_IN_AN_DAY * 1000 - MILLISECS_IN_AN_MINITE,
issuer, subject, origIssuer, origRoleList, schema);
// Refresh
Http.request("authn/refresh-cl.txt")
.with("remoteCell", TEST_CELL2)
.with("refresh_token", invalidToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_BAD_REQUEST);
}
/**
* スキーマ認証_スキーマトークンの期限切れの場合認証エラーになること.
*/
@Test
public final void スキーマ認証_スキーマトークンの期限切れの場合認証エラーになること() {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_APP_CELL1);
String subject = issuer + "#account1";
String target = UrlUtils.cellRoot(TEST_CELL1);
List<Role> roleList = new ArrayList<Role>();
String schema = "";
String account = "account1";
String pass = "password1";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellAccessToken validToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR + MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// セルに対してトークン認証
Http.request("authn/password-cl-cp.txt")
.with("remoteCell", TEST_CELL1)
.with("username", account)
.with("password", pass)
.with("client_id", UrlUtils.cellRoot(TEST_APP_CELL1))
.with("client_secret", validToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_OK);
// 期限切のトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellAccessToken invalidToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR - MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// セルに対してトークン認証
Http.request("authn/password-cl-cp.txt")
.with("remoteCell", TEST_CELL1)
.with("username", account)
.with("password", pass)
.with("client_id", UrlUtils.cellRoot(TEST_APP_CELL1))
.with("client_secret", invalidToken.toTokenString())
.returns()
.statusCode(HttpStatus.SC_BAD_REQUEST);
}
/**
* データアクセス_自分セルローカルトークンの期限切れの場合認証エラーになること.
*/
@Test
public final void データアクセス_自分セルローカルトークンの期限切れの場合認証エラーになること() {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = "account2";
String schema = "";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
AccountAccessToken validToken = new AccountAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR + MILLISECS_IN_AN_MINITE,
issuer, subject, schema);
// データアクセス
ResourceUtils.retrieve(validToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_OK, TEST_CELL1, Setup.TEST_BOX1);
// 期限切れのトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
AccountAccessToken invalidToken = new AccountAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR - MILLISECS_IN_AN_MINITE,
issuer, subject, schema);
// データアクセス
ResourceUtils.retrieve(invalidToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_UNAUTHORIZED, TEST_CELL1, Setup.TEST_BOX1);
}
/**
* データアクセス_他人セルローカルトークンの期限切れの場合認証エラーになること.
* @throws MalformedURLException URLパースエラー
*/
@Test
public final void データアクセス_他人セルローカルトークンの期限切れの場合認証エラーになること() throws MalformedURLException {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = issuer + "account2";
List<Role> roleList = new ArrayList<Role>();
Role role = new Role(new URL(UrlUtils.roleResource(TEST_CELL1, "__", "role2")));
roleList.add(role);
String schema = "";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
CellLocalAccessToken validToken = new CellLocalAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR + MILLISECS_IN_AN_MINITE,
issuer, subject, roleList, schema);
// データアクセス
ResourceUtils.retrieve(validToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_OK, TEST_CELL1, Setup.TEST_BOX1);
// 期限切れのトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
CellLocalAccessToken invalidToken = new CellLocalAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR - MILLISECS_IN_AN_MINITE,
issuer, subject, roleList, schema);
// データアクセス
ResourceUtils.retrieve(invalidToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_UNAUTHORIZED, TEST_CELL1, Setup.TEST_BOX1);
}
/**
* データアクセス_トランスセルトークンの期限切れの場合認証エラーになること.
* @throws MalformedURLException URLパースエラー
*/
@Test
public final void データアクセス_トランスセルトークンの期限切れの場合認証エラーになること() throws MalformedURLException {
long issuedAt = new Date().getTime();
String issuer = UrlUtils.cellRoot(TEST_CELL1);
String subject = issuer + "#account2";
String target = UrlUtils.cellRoot(TEST_CELL2);
List<Role> roleList = new ArrayList<Role>();
Role role = new Role(new URL(UrlUtils.roleResource(TEST_CELL1, "__", "role2")));
roleList.add(role);
String schema = "";
// 期限切れでないトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellAccessToken validToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR + MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// データアクセス
ResourceUtils.retrieve(validToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_OK, TEST_CELL2, Setup.TEST_BOX1);
// 期限切れのトークンを生成(IT環境の通信時間を考慮して1分余裕を持たせる)
TransCellAccessToken invalidToken = new TransCellAccessToken(
issuedAt - AbstractOAuth2Token.MILLISECS_IN_AN_HOUR - MILLISECS_IN_AN_MINITE,
issuer, subject, target, roleList, schema);
// データアクセス
ResourceUtils.retrieve(invalidToken.toTokenString(),
DAV_COLLECTION + DAV_RESOURCE, HttpStatus.SC_UNAUTHORIZED, TEST_CELL2, Setup.TEST_BOX1);
}
}