Android 从本机登录页面使用登录凭据实现Oauth2

Android 从本机登录页面使用登录凭据实现Oauth2,android,oauth-2.0,Android,Oauth 2.0,我正在尝试实现基于Oauth2的web服务。我有clientID、clientSecret、授权端点、令牌端点和回调Url(自定义模式指向android本机页面)。当我检查其他基于Oauth2的API时,它有一个登录Url,它将被重定向到一个登录网页。但在我的例子中并没有登录URL,但它应该被重定向到本机登录页面,在成功响应时,它应该被重定向到登录本机页面。如何使用Oauth2获取访问令牌? 任何帮助都将不胜感激 从上面的评论中,我们假设您已经使用ASP.NET WebAPI作为服务器端应用程序

我正在尝试实现基于Oauth2的web服务。我有clientID、clientSecret、授权端点、令牌端点和回调Url(自定义模式指向android本机页面)。当我检查其他基于Oauth2的API时,它有一个登录Url,它将被重定向到一个登录网页。但在我的例子中并没有登录URL,但它应该被重定向到本机登录页面,在成功响应时,它应该被重定向到登录本机页面。如何使用Oauth2获取访问令牌?
任何帮助都将不胜感激

从上面的评论中,我们假设您已经使用ASP.NET WebAPI作为服务器端应用程序,如果您的Android客户端应用程序使用
HttpUrlConnection
,您可以参考以下示例代码(当然,您需要修改更多以使其符合您的要求):

String address=“http://:/token”;
HttpURLConnection-urlConnection;
字符串请求体;
Uri.Builder=新的Uri.Builder();
Map stringMap=newhashmap();
stringMap.put(“授权类型”、“密码”);
stringMap.put(“用户名”、“bnk”);
stringMap.put(“密码”、“bnk”);
迭代器条目=stringMap.entrySet().Iterator();
while(entries.hasNext()){
Map.Entry=(Map.Entry)entries.next();
builder.appendQueryParameter(entry.getKey().toString(),entry.getValue().toString());
条目。删除();
}
requestBody=builder.build().getEncodedQuery();
试一试{
URL=新的URL(地址);
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod(“POST”);
setRequestProperty(“内容类型”,“应用程序/x-www-form-urlencoded”);
OutputStream OutputStream=新的BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(outputStream,utf-8));
writer.write(请求体);
writer.flush();
writer.close();
outputStream.close();
urlConnection.connect();
if(urlConnection.getResponseCode()==HttpURLConnection.HTTP\u确定){
//做点什么。。。
}否则{
//做点什么。。。
}
//做点什么。。。
}捕获(例外e){
e、 printStackTrace();
}
更新:

如果您愿意,请参考以下工作代码:

    private class AccessTokenRequest extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... voids) {
            String accessToken = null;
            OkHttpJsonRequest jsonRequest = new OkHttpJsonRequest();
            RequestBody requestBody = new FormEncodingBuilder()
                    .add("grant_type", "password")
                    .add("username", "bnk")
                    .add("password", "bnk123")
                    .build();
            try {
                JSONObject jsonObject = jsonRequest.post("http://192.168.1.100:24780/token", requestBody);
                if (!jsonObject.isNull("access_token")) {
                    accessToken = jsonObject.getString("access_token");                        
                }
            } catch (IOException | JSONException e) {
                e.printStackTrace();
            }
            return accessToken;
        }

        @Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);
            // do something such as storing the token for furture requests
        }
    }

    public class OkHttpJsonRequest {
        OkHttpClient client = new OkHttpClient();

        JSONObject post(String url, RequestBody body) throws IOException, JSONException {
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Response response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        }
    }
私有类AccessTokenRequest扩展异步任务{
@凌驾
受保护的字符串背景(无效…无效){
字符串accessToken=null;
OkHttpJsonRequest jsonRequest=新的OkHttpJsonRequest();
RequestBody RequestBody=新FormEncodingBuilder()
.添加(“授权类型”、“密码”)
.add(“用户名”、“bnk”)
.添加(“密码”、“bnk123”)
.build();
试一试{
JSONObject JSONObject=jsonRequest.post(“http://192.168.1.100:24780/token“,请求机构);
如果(!jsonObject.isNull(“访问令牌”)){
accessToken=jsonObject.getString(“访问令牌”);
}
}捕获(IOException | JSONException e){
e、 printStackTrace();
}
返回accessToken;
}
@凌驾
受保护的void onPostExecute(字符串响应){
super.onPostExecute(响应);
//执行一些操作,例如为将来的请求存储令牌
}
}
公共类OkHttpJsonRequest{
OkHttpClient=新的OkHttpClient();
JSONObject post(字符串url,请求主体)抛出IOException,JSONException{
Request Request=newrequest.Builder()
.url(url)
.职位(机构)
.build();
Response=client.newCall(request.execute();
返回新的JSONObject(response.body().string());
}
}

希望这有帮助

您可以使用。

如果我正确理解您的问题,并且您的服务器应用程序是Asp.Net WebAPI,则您的客户端(android、web浏览器)可以正常访问/token(例如)以获取访问令牌。然后,令牌将存储在您的客户端应用程序中,用于其他需要授权的请求。是的,使用Oauth2获取令牌,并将其用于后续的Web服务调用。那么,您的问题是什么?在您的android应用程序中,使用HttpUrlConnection或其他库,如Volley、Refundation、OkHttp来请求我提到的上述/token,当然,你必须提供授权类型、用户名和密码。我试过了,现在正在工作。
    private class AccessTokenRequest extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... voids) {
            String accessToken = null;
            OkHttpJsonRequest jsonRequest = new OkHttpJsonRequest();
            RequestBody requestBody = new FormEncodingBuilder()
                    .add("grant_type", "password")
                    .add("username", "bnk")
                    .add("password", "bnk123")
                    .build();
            try {
                JSONObject jsonObject = jsonRequest.post("http://192.168.1.100:24780/token", requestBody);
                if (!jsonObject.isNull("access_token")) {
                    accessToken = jsonObject.getString("access_token");                        
                }
            } catch (IOException | JSONException e) {
                e.printStackTrace();
            }
            return accessToken;
        }

        @Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);
            // do something such as storing the token for furture requests
        }
    }

    public class OkHttpJsonRequest {
        OkHttpClient client = new OkHttpClient();

        JSONObject post(String url, RequestBody body) throws IOException, JSONException {
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Response response = client.newCall(request).execute();
            return new JSONObject(response.body().string());
        }
    }