Android Oauth + PHP(Symfony3 + FOS Oauth Server Bundle)

时间:2016-11-12 15:55:33

标签: android oauth symfony fosoauthserverbundle

我试图在我的Android(基于KitKat的)应用中实施oauth授权。

我已经准备好了自己的oauth2服务器,基于php(Symfony3 Framework + FOS Oauth Server Bundle)。 现在我需要在Android应用程序中进行授权。 我在互联网上想知道,我没有找到任何可以帮助我做授权的解决方案。有很多文档,使用谷歌或其他社交服务描述OAUTH,但是,正如我所说,我有自己的oauth服务器。

我试图在移动应用中制作一些东西,我遇到了一些问题。 Oauth流程需要在应用程序中打开Web视图元素,并接受我的应用程序对我的Web帐户的使用。此流程在我的服务器中工作,但我不知道如何在应用程序中执行此操作。我试图打开Web视图,我正在通过auth流程并获取代码,但它显示在webview中。 我找到了方法 - 捕获web视图加载的时刻,在这种情况下 - 我可以从Web视图URL中捕获一些参数,但我在web中的oauth流在防火墙下。如果我没有在网络上授权 - 流程会将我重定向到登录页面,稍后 - 在成功登录后 - 它会让我接受或拒绝使用我的帐户数据。所以,我不能使用onPageFinished或其他东西。

其他情况下,我可以通过传递login,password,client_id,secret和其他参数来获取access_token。我想在应用程序中创建2个服务,首先将在本地检查 - 如果我的令牌未过期,如果是 - 它将运行第二个服务 - 刷新我的令牌 - 向我的oauth服务器(Web应用程序)发出http请求。但我在这里遇到另一个问题。

我使用Volley库进行http调用。据我所知,volley运行异步请求到web。我试图将我的请求转移到单独的类/服务中。 但我遇到了可空的上下文问题。好。我决定在活动类中提出请求(不是很好的使用情况,但确定),并且 - 我遇到了另一个问题。 我已经为它定义了按钮和onClick监听器。 我想在用户路径登录和密码到EditText字段和onClick for登录按钮后对用户进行身份验证 - 我正在检查client_id的SharedPreferences,如果它是空的 - 我想要新的来自网络的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 Listener的代码部分。 clientResponse变量在活动类中定义为全局变量。

Ofcorse,我可以把我的逻辑放到响应声明中 - 当凌空得到回应 - 做我的东西,但我想 - 以后,我的代码将是不可读的,并且它不是构建应用程序结构的好方法。根据另一个请求提出请求是完全废话,等等......

当我的请求在另一个班级工作时,我有很好的案例。 我在互联网上看到了一些例子 - 一些人试图提供应用服务 - 通过排球提出请求,但可能,这个信息现在不是实际的。每一个互联网案例 - 我发现 - 都不会工作或提供无用的信息。

我认为这个挑战就像无法取胜一样。我尝试的所有东西 - 失败并且不能工作 我希望,我完全解释了我的问题。 谢谢。

0 个答案:

没有答案