0

OpenID で Play Framework 2.1 を使用し、OpenID プロバイダーからの認証をキャンセルすると、次の例外が発生します。

[RuntimeException: play.api.libs.openid.Errors$AUTH_CANCEL$]

これが私のコードです:

Promise<UserInfo> userInfoPromise = OpenID.verifiedId();
UserInfo userInfo = userInfoPromise.get(); // Exception thrown here

しかし、これはランタイム例外であるため、try/catch でキャッチできないため、例外を回避する方法に行き詰まり、サーバー エラーよりも優れたものをクライアントに返します。

どうやってやるの?

4

1 に答える 1

1

Promise は成功バイアスであり、そのすべての操作について、エラーではなく実際に値が含まれていると想定します。get変換されていないエラーを含む promise を呼び出そうとすると、例外が発生します。

必要なのは、Promise が成功かエラーかを判断することです。たとえば、パターン マッチングを使用してそれを行うことができます。

このコードを試してください:

AsyncResult(
      OpenID.verifiedId.extend1( _ match {
        case Redeemed(info) => Ok(info.attributes.get("email").getOrElse("no email in valid response"))
        case Thrown(throwable) => {
          Logger.error("openid callback error",throwable)
          Unauthorized
        }
      }
      )
    )

将来と約束についてもっと読みたいと思うかもしれません。私はこの素晴らしい記事をお勧めします: http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to -the-future.html

編集:Javaでドキュメント(http://www.playframework.com/documentation/2.1.0/JavaOpenID)をチェックすると、自分で例外をキャッチして処理することになっているようです。

いずれにせよ、例外をキャッチし、例外がスローされた場合は、ユーザーを関連情報を含むログイン ページにリダイレクトする必要があります。

このようなものが動作するはずです:

public class Application extends Controller {


    public static Result index() {
        return ok("welcome");
    }

    public static Result auth() {
        Map<String, String> attributes = new HashMap<String, String>();
        attributes.put("email", "http://schema.openid.net/contact/email");
        final Promise<String> stringPromise = OpenID.redirectURL("https://www.google.com/accounts/o8/id", "http://localhost:9000/auth/callback",attributes);
        return redirect(stringPromise.get());
    }


    public static Result callback() {
        try{
            Promise<UserInfo> userInfoPromise = OpenID.verifiedId();
            final UserInfo userInfo = userInfoPromise.get();
            System.out.println("id:"+userInfo.id);
            System.out.println("email:"+userInfo.attributes.get("email"));
            return ok(userInfo.attributes.toString());
        } catch (Throwable e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            return unauthorized();
        }
    }
}
于 2013-02-17T21:21:22.117 に答える