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、私は自分のロジックを応答ステートメントに入れることができます-ボレーが応答を得たとき-自分のことをしますが、後でコードが読めなくなり、アプリ構造を構築するための良いアプローチではありません. 別のリクエストに応じてリクエストを行うなど、まったくでたらめです...
私のリクエストが別のクラスで機能していたとき、私は良いケースを持っていました。私はインターネットで例を見ました - 一部の人がアプリサービスを作成しようとしている方法 - ボレーを通じてリクエストを行う方法ですが、おそらく、この情報は現在実際のものではありません. 私が見つけたすべてのインターネットケースは機能しないか、役に立たない情報を提供します.
この挑戦は勝てないと思います。私が試したものはすべて失敗し、機能しません。
私の問題を完全に説明したことを願っています。ありがとうございました。