2

Android (KitKat ベース) アプリに oauth 認証を実装しようとしています。

php (Symfony3 Framework + FOS Oauth Server Bundle) に基づいて、独自の oauth2 サーバーを用意しました。次に、Android アプリで承認を行う必要があります。インターネットで疑問に思っていましたが、認証を行うのに役立つ解決策が見つかりませんでした。Google や他のソーシャル サービスを使用した OAUTH について説明しているドキュメントはたくさんありますが、前述したように、私は独自の oauth サーバーを持っています。

モバイルアプリで何かを作ろうとしていたのですが、いくつかの問題に遭遇しました。Oauth フローでは、アプリで Web ビュー要素を開き、アプリによる Web アカウントの使用を受け入れる必要があります。このフローは私のサーバーでは機能しますが、アプリで行う方法がわかりません。Web ビューを開こうとしましたが、認証フローを渡してコードを取得していましたが、Web ビュー内に表示されます。Web ビューの読み込みの瞬間をキャッチするメソッドを見つけました。この場合、Web ビューの URL からいくつかのパラメーターをキャッチできますが、Web の OAuth フローはファイアウォールの下にあります。Web で認証されていない場合、フローはログイン ページにリダイレクトし、後でログインに成功すると、アカウント データの使用を受け入れるか拒否するかを提示します。したがって、onPageFinished などは使用できません。

その他の場合、login、password、client_id、secret、およびその他のパラメーターを渡すことで、access_token を取得できます。アプリで2つのサービスを作成することを考えていました.最初はローカルでチェックします-トークンの有効期限が切れていない場合、そうであれば-2番目のサービスを実行します-トークンを更新します-oauthサーバー(Webアプリケーション)にhttpリクエストを作成します. しかし、ここで別の問題に遭遇します。

Volley ライブラリを使用して http 呼び出しを行っています。私が知っているように、volley は Web への非同期リクエストを実行します。リクエストを別のクラス/サービスに移動しようとしていました。しかし、null 可能なコンテキストに問題がありました。Ok。私はアクティビティ クラスでリクエストを行うことにしました (使用法は適切ではありませんが、問題ありません)。そこで、別の問題に遭遇しました。ボタンとその onClick リスナーを定義しました。ログインとパスワードを EditText フィールドと onClick でサインイン ボタンにパスした後、ユーザーを認証したい - client_id の SharedPreferences をチェックしており、それが空の場合 - Web から新しい oauth client_id を取得したいonClickListener で新しいボレー リクエストを実行しています。問題は、応答が正しく得られないことです。私のコード例。

``` signIn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View view) {
            String login = LoginView.getText().toString();
            String password = PasswordView.getText().toString();

            auth_dialog = new Dialog(LoginActivity.this);
            auth_dialog.setContentView(R.layout.auth_dialog);
            preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            preferences.edit().putString(getString(R.string.oauth_client_id), null).apply();
            String clientId = preferences.getString(getString(R.string.oauth_client_id), null);
            preferences.edit().putString(getString(R.string.user_login), login).apply();
            preferences.edit().putString(getString(R.string.user_password), password).apply();

            if(clientId == null){
                RequestQueue queue = Volley.newRequestQueue(context);
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
                String url = context.getString(R.string.url) + context.getString(R.string.url_token) + "?";
                url += "client_id=" + preferences.getString(context.getString(R.string.oauth_client_id), null) + "&";
                url += "client_secret=" + preferences.getString(context.getString(R.string.oauth_client_secret), null) + "&";
                url += "grant_type=" + context.getString(R.string.grant_type_password) + "&";
                url += "username=" + preferences.getString(context.getString(R.string.user_login), null) + "&";
                url += "password=" + preferences.getString(context.getString(R.string.user_password), null);

                StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response){
                        clientResponse = response;
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(context, "Request for getting Token failed", Toast.LENGTH_SHORT).show();
                    }
                });
                queue.add(stringRequest);
            }
            Log.d("VIOO_APP", clientResponse);// THIS IS THE PLACE WHERE ERROR HAPPENS
            token = getToken();
            Toast.makeText(getApplicationContext(), token.getAccessToken(), Toast.LENGTH_LONG).show();
        }
    });```

すべての変数が定義されていると言いたいです-それは、ボタンのonClickリスナーからのコードの一部です。clientResponseグローバル変数としてアクティビティ クラスで定義された変数。

Ofcorse、私は自分のロジックを応答ステートメントに入れることができます-ボレーが応答を得たとき-自分のことをしますが、後でコードが読めなくなり、アプリ構造を構築するための良いアプローチではありません. 別のリクエストに応じてリクエストを行うなど、まったくでたらめです...

私のリクエストが別のクラスで機能していたとき、私は良いケースを持っていました。私はインターネットで例を見ました - 一部の人がアプリサービスを作成しようとしている方法 - ボレーを通じてリクエストを行う方法ですが、おそらく、この情報は現在実際のものではありません. 私が見つけたすべてのインターネットケースは機能しないか、役に立たない情報を提供します.

この挑戦は勝てないと思います。私が試したものはすべて失敗し、機能しません。
私の問題を完全に説明したことを願っています。ありがとうございました。

4

0 に答える 0