2016-10-06 12 views
1

オンラインドキュメントhereに記載されているように、WSO2 APIマネージャ(v1.10.0)を分散アーキテクチャで実装しました。WSO2 APIマネージャー認証UNIQUE KEY制約違反

これは(5台の別々のサーバに)次のように構成されます

  • ゲートウェイ(×2)
  • 出版社&ストア(単一のサーバー上)
  • キーマネージャ(×2)

これらは、SQL Server 2014インスタンス上にある3つの通常のAPIマネージャデータベース(レジストリ、ユーザーマネージャ& APIマネージャ)に接続されています。

私たちは、Webサイトユーザーの認証(ログイン、パスワードの忘れなど)やAPI呼び出しの認証にキーマネージャーを使用しています。しかし

、キーマネージャ上で、私は、次の(UNIQUE KEY制約の違反を)見ているサイトにログインし、エラーをしようとしたとき:

TID:[-1] [] [2016- 10-06 00:36:47842] ERROR {org.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask} - アクセストークンを永続化中にエラーが発生し :c5a0a11e63388dCHANGEDea34b0533445 {org.wso2.carbon.identity.oauth2.daoを.TokenPersistenceTask} org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception: コンシューマーキーのアクセストークンを格納するときのエラー: org.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.persistAccessTokenでorg.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:246) でfpA6AhOfbVCHANGEDgH0WzBDOga(TokenMgtDAO.java:284 ) でorg.wso2.carbon.identity.oauth2.dao.TokenPersistenceTask.run(TokenPersistenceTask.java:52) でjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ジャワで。 (スレッド:java:745)の原因: com.microsoft.sqlserver.jdbc.SQLServerException:UNIQUEの違反 このスレッドに返信します...返信ありがとうございました。キーコンひどい 'CON_APP_KEY'。オブジェクト 'dbo.IDN_OAUTH2_ACCESS_TOKEN'に重複キーを挿入できません。重複するキー値は(15、 [email protected]、-1234、 APPLICATION_USER、369db21a386ae4CHANGED0ff34d35708d、ACTIVE、NONE)です。 でcom.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) でcom.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) com.microsoft.sqlserverました。 com.microsoft.sqlserver.jdbc.TDSCommand.executeで com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement $ PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) (でjdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) IOBuffer.java:5696) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 次の場所にあります。 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement。ジャワ: 180) でcom.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332) ORGで.wso2.carbon.identity.oauth2.dao.TokenMgtDAO.storeAccessToken(TokenMgtDAO.java:224) ... 5もっと

これは、ウェブサイト上で、次の.NETのエラーが生じている:

wso2 dotnet error

私はこれをGoogleで試しましたが、最新の回答が見つかりません。

マスターマネージャーと作業ノード(アウトラインhere)を持つようにキーマネージャーを構成していないため、これは必要でないことが文書に示されているようです。

ご協力いただければ幸いです。

答えて

0

以下の設定(<PoolSize>0</PoolSize>)を<APIM_HOME>/repository/conf/identity.xmlに変更できますか?既定では、PoolSizeは100に設定されています。

<JDBCPersistenceManager> 
    <SessionDataPersist> 
     <PoolSize>0</PoolSize> 
    </SessionDataPersist> 
</JDBCPersistenceManager> 

希望すると、問題が解決します。

参考:いくつかのデバッグ後http://sanjeewamalalgoda.blogspot.com/2015/08/how-to-avoid-getting-incorrect-access.html

+0

こんにちは@Bhathiya。ご回答有難うございます。あなたがリンクしているページが見えました。しかし、私はこれを私が作業しているバージョン(v1.10.0ではなくv1.9)として割り引いた。0)には '/repository/conf/identity.xml'ファイルがなく、' /repository/conf/indentity/identity.xml'ファイルには 'PoolSize'要素がありません。ただし、 true ...要素(現在コメントアウトされています)があります。私はそれをコメントする必要がありますか?もしそうなら、その値は 'true'か' false'でしょうか? –

+0

私は ''要素のコメントを外し、 ' true true'を、次に ' false'を設定しようとしました。しかし、私はどちらの場合も同じ問題を抱えていました。最初にクリーンアップを実行し(値を1に設定して)、次に ' true'を入力して試してみます。 ' –

+0

はい、有効にして、' 'と設定してみてください。 – Bee

1

は、問題を見つけました!私たちは、この設定を入れる前に、

<JDBCPersistenceManager> 
    <SessionDataPersist> 
     <PoolSize>0</PoolSize> 
    </SessionDataPersist> 
</JDBCPersistenceManager> 

APIMは、コ​​ールを取得する単一のトークンのためIDN_OAUTH2_ACCESS_TOKENテーブルに複数のACTIVEのOAuthトークンを保存することができます。

トークン検証エンドポイントがトークンを照会すると、最後のトークンのみが返されます(時間ベースのソートと制限が使用されます)。そのトークンの有効期限が切れているときは、それを非アクティブとしてマークします。しかし前のものはそのまま維持されます。

リフレッシュトークンが発生すると、最新のトークンが非アクティブであるかどうかがチェックされます。非アクティブなので、新しいトークンを発行します。しかし、トークン・エンドポイントがトークンを永続化しようとすると、別のACTIVEトークンがあります。そのため、この例外が発生しました。

この問題を解決するために、IDN_OAUTH2_ACCESS_TOKENテーブルの更新クエリを実行して、すべてのアクティブトークンをINACTIVEにすることができます。

update IDN_OAUTH2_ACCESS_TOKEN set TOKEN_STATE="INACTIVE" where TOKEN_STATE="ACTIVE" 

古いフォールトトークンは削除され、サーバーは正常に動作します。

+0

こんにちは。ご回答有難うございます。いつ 'update' SQLコマンドを実行しますか?それは単なる仕事ですか?もしそうなら、どのようにしてこの問題が再発するのを防ぐのですか? –

+0

この問題の原因は、を追加せずに最初に実行されたためです。 0の場合は発生しません。 – andunslg

+0

残念ながら、私はまだ 'CON_APP_KEY'ユニークキーの問題を見ています。これは' 'を設定した後でもあります。これは、しばらく離れてからアプリケーションWebページを更新するときにのみ発生します。 –

1

私はmysqlを使用していて、同じ問題に直面していました。プールサイズの変更も完全な解決策ではありませんでした。それから、idn_oauth2_access_tokenテーブルについて奇妙なことに気付きました。 time_createdという列がありますが、その内容は作成された時刻ではありません。これは最後の更新タイムスタンプでした。私はtime_created列の中のいくつかの列のシステム注文のどこかを読んでいます。私は自分のSQLスクリプトを調べ、更新が発生したときにデータベースがこの列を更新したことを確認しました。私はこのルールを削除しましたが、これ以上のエラーはありません。

関連する問題