17

認証に OAuth を使用するアプリを開発していますが、OAuth コールバックの処理に少し問題があります。

認証

私のアプリにはログイン画面としてwebview があり、webviewに認証フォームを読み込むための URL が与えられています。URLが次のとおりであるとしましょう:

https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ

認証アクティビティ(AuthActivity.java)には、次のものがあります。

    String authURL = https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ
    myWebView.loadUrl(authURL);

manifest.xml には、oauth コールバック処理について次のように記載されています。

<activity
            android:name=".AuthActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="authprovider"
                    android:scheme="auth" />
            </intent-filter>
</activity>

問題

この URL を webview で (loadURL() メソッドを使用して) 使用すると、REAL OAUTH WEB FROM (webview にロードする必要があります) を含む別の URL にリダイレクトされます。問題は、このリダイレクトが Android のインテント選択を自動的に開始することです。URL は Web ブラウザーによって処理される必要があるため、Android では、電話で使用可能な Web ブラウザーのいずれかを選択して URL を開くことができます。

これは私が望んでいるものではないので、リダイレクトが webview 内で処理され、web ブラウザー (またはその他) が起動しないように、次のコードを含める必要があります。

myWebView.setWebViewClient(new WebViewClient());

したがって、このコードでは、リダイレクトは「webview 内」で処理され、ログイン画面が表示されます。

その後、資格情報を入力できます (例: Twitter 経由の oauth) が、認証が完了するとコールバックが受信されますが、コールバックを処理するはずのアクティビティ (マニフェストでコールバックを受信するように構成された AuthActivity) は起動されません。代わりに、URL コールバック (この例では、マニフェストで構成されている authprovider://auth/XXX?xxx=yyy) が見つからないというメッセージを表示する webview があります。

その理由は、次のコードである可能性があります。

myWebView.setWebViewClient(new WebViewClient());

は、webview がすべてを処理することを Android に伝えます。そのため、コールバック URL は Web URL ではないため、処理に問題があり、それを処理できるインテントを起動することさえできません。

質問

この問題を解決するにはどうすればよいですか? アクティビティがコールバックを処理できるようにする必要がありますが、webview がそれを読み込もうとしないようにする必要があります。

任意の助けをいただければ幸いです

前もって感謝します

4

3 に答える 3

26

まずマニフェストで、これらのプロパティを WebView を起動するアクティビティに設定します

android:launchMode="singleInstance" 

それにインテントフィルターを追加します

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="oauth-testing" />
</intent-filter>

次に、ユーザーがログインボタンをクリックしたときにコードで

mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);
WebView webView = new WebView(this);
webView.requestFocus(View.FOCUS_DOWN);
webView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
            if (!v.hasFocus()) {
                v.requestFocus();
            }
            break;
        }
        return false;
    }
});
webView.loadUrl(mReqToken.getAuthenticationURL());
mainLayout.removeAllViews();
mainLayout.addView(webView);

ここにコールバック URL が
private static final String CALLBACK_URL = "oauth-testing:///";
あり、動的 Web ビューを作成してユーザーに表示しています。ログイン後、webview が閉じられ、コードがonNewIntent(). そこにログインした後、機能を実装する必要があります。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    dealWithTwitterResponse(intent);
}  
private void dealWithTwitterResponse(Intent intent) {
    Uri uri = intent.getData();
    System.out.println("URI=" + uri);
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
        String oauthVerifier = uri.getQueryParameter("oauth_verifier");
        authoriseNewUser(oauthVerifier);
    }
}

多くのコード スニペットを追加したことはわかっていますが、そのうちのいくつかは関連しない可能性がありますが、いつか誰かの役に立てば幸いです。

于 2012-10-01T13:19:29.173 に答える
0

まず、サービス プロバイダーから提供された URL を呼び出す必要がある場合があります。リダイレクトが存在する場合は、HTTP ステータス コード 3xx が返されます。次に、リダイレクトが存在する場合は、実際の URL の呼び出しを試みることができます。通常の HTTP 応答の場合、HTTP 2xx ステータス コードが返されます。

于 2012-10-01T13:15:05.400 に答える