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