Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android应用程序的RESTful Api身份验证_Android_Json_Rest_Oauth_Oauth 2.0 - Fatal编程技术网

android应用程序的RESTful Api身份验证

android应用程序的RESTful Api身份验证,android,json,rest,oauth,oauth-2.0,Android,Json,Rest,Oauth,Oauth 2.0,我有一个任务,我需要使用电子邮件和密码来验证用户身份并获取访问令牌。我有api密钥、密码和基本URL。我不需要为分配使用重定向URL,也没有提供。我不确定使用哪种方法或哪种库。我沉浸在丰富的信息中,这让我感到困惑。我需要被指向正确的方向。。。。欢迎任何形式的帮助。谢谢我建议您使用图书馆来完成这项工作 假设您的URL库为,您必须执行GET请求/登录,并传递电子邮件和密码。我假设您的API将以JSON的形式返回用户对象 Api.java public interface Api { @GE

我有一个任务,我需要使用电子邮件和密码来验证用户身份并获取访问令牌。我有api密钥、密码和基本URL。我不需要为分配使用重定向URL,也没有提供。我不确定使用哪种方法或哪种库。我沉浸在丰富的信息中,这让我感到困惑。我需要被指向正确的方向。。。。欢迎任何形式的帮助。谢谢

我建议您使用图书馆来完成这项工作

假设您的URL库为,您必须执行GET请求/登录,并传递电子邮件和密码。我假设您的API将以JSON的形式返回用户对象

Api.java

public interface Api {

    @GET("/login")
    public void login(@Query("email") String email, @Query("password"), Callback<User> callback);

}
公共接口Api{
@获取(“/login”)
公共无效登录(@Query(“email”)字符串email、@Query(“密码”)、回调);
}
需要执行API调用的位置:

Retrofit retrofit = new Retrofit.Builder()
    .setEndpoint("http://baseurl.com")
    .build();

Api api = retrofit.create(Api.class);
api.login(email, password, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // login logic
    }

    @Override
    public void failure(RetrofitError error) {
        Log.e("Retrofit", error.getMessage());
    }
});
reformation-reformation=new-reformation.Builder()
.setEndpoint(“http://baseurl.com")
.build();
Api=改装.create(Api.class);
api.login(电子邮件、密码、新回调(){
@凌驾
public void成功(用户、响应){
//登录逻辑
}
@凌驾
公共无效失败(错误){
Log.e(“改装”,error.getMessage());
}
});

我希望这个例子能帮助你。别忘了阅读

我建议您使用库来完成这项工作

假设您的URL库为,您必须执行GET请求/登录,并传递电子邮件和密码。我假设您的API将以JSON的形式返回用户对象

Api.java

public interface Api {

    @GET("/login")
    public void login(@Query("email") String email, @Query("password"), Callback<User> callback);

}
公共接口Api{
@获取(“/login”)
公共无效登录(@Query(“email”)字符串email、@Query(“密码”)、回调);
}
需要执行API调用的位置:

Retrofit retrofit = new Retrofit.Builder()
    .setEndpoint("http://baseurl.com")
    .build();

Api api = retrofit.create(Api.class);
api.login(email, password, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // login logic
    }

    @Override
    public void failure(RetrofitError error) {
        Log.e("Retrofit", error.getMessage());
    }
});
reformation-reformation=new-reformation.Builder()
.setEndpoint(“http://baseurl.com")
.build();
Api=改装.create(Api.class);
api.login(电子邮件、密码、新回调(){
@凌驾
public void成功(用户、响应){
//登录逻辑
}
@凌驾
公共无效失败(错误){
Log.e(“改装”,error.getMessage());
}
});

我希望这个例子能帮助你。别忘了根据您的评论阅读

,说明告诉您如何使用。您可以在规范中看到

 POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=password&username=johndoe&password=A3ddj3w
唯一看起来奇怪的事情(如果您从未遇到过的话)是
Authorization
标题值。仔细阅读。基本上,
CZCAGRSA3F0MZPNWDFMQMF0M2JW
用户名:密码的base64编码(实际上是

如果不使用任何外部库(仅使用标准Javalibs)来发出请求,您可能会遇到如下情况

String formData = "username=<uname>&password=<pass>&grant_type=password";
String header = "Basic " + Base64.encodeAsString("<client_id>:<client_secret>");

HttpURLConnection connection
                = (HttpURLConnection) new URL(tokenUrl).openConnection();
connection.setDoOutput(true);
connection.addRequestProperty("Authorization", header);
connection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", Integer.toString(formData.length()));

OutputStream out = connection.getOutputStream();
out.write(formData.getBytes(StandardCharsets.UTF_8));

InputStream in = connection.getInputStream();
AccessToken token = new ObjectMapper().readValue(in, AccessToken.class);
System.out.println(token);

out.close();
in.close();

从那里,一旦你有了令牌,你想要做的任何资源请求,你只需要添加一个
授权
头和
承载人
根据你的评论,说明告诉你使用。您可以在规范中看到

 POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=password&username=johndoe&password=A3ddj3w
唯一看起来奇怪的事情(如果您从未遇到过的话)是
Authorization
标题值。仔细阅读。基本上,
CZCAGRSA3F0MZPNWDFMQMF0M2JW
用户名:密码的base64编码(实际上是

如果不使用任何外部库(仅使用标准Javalibs)来发出请求,您可能会遇到如下情况

String formData = "username=<uname>&password=<pass>&grant_type=password";
String header = "Basic " + Base64.encodeAsString("<client_id>:<client_secret>");

HttpURLConnection connection
                = (HttpURLConnection) new URL(tokenUrl).openConnection();
connection.setDoOutput(true);
connection.addRequestProperty("Authorization", header);
connection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", Integer.toString(formData.length()));

OutputStream out = connection.getOutputStream();
out.write(formData.getBytes(StandardCharsets.UTF_8));

InputStream in = connection.getInputStream();
AccessToken token = new ObjectMapper().readValue(in, AccessToken.class);
System.out.println(token);

out.close();
in.close();

从那里,一旦你有了令牌,你想要做的任何资源请求,你只需要添加一个
授权
头和
承载

你需要使用Oauth 1.0还是2.0?从你的问题很难判断。1.0使用“消费者密钥”和“消费者秘密”(所以我认为可能是1.0),但它需要重定向(可能不是)。2.0不需要重定向(好的),但使用“客户端id”和“客户端机密”(不符合要求)。请澄清,以获得进一步的帮助。请查看OAuth 2.0规范中的。我相信这就是说明所要求的。它显示了一个示例令牌请求,其中客户机id(api密钥…可能)和客户机机密被base64编码到授权头中。你可能想向你的导师或给你布置作业的人澄清这一点。另请参见下面的大纲,了解如何正确制定授权标头。为了本练习的目的,请使用此处概述的电子邮件/密码流获取访问令牌XXXXXXXXXXXX。请注意,此练习不需要重定向uri URL参数,只需要用户名、密码、客户端id和客户端机密。您不必关心令牌是否过期,也不必关心为此分配刷新令牌,您只对响应的访问令牌部分感兴趣。一旦您为用户获得访问令牌,任何后续的API调用都可以通过将Authorization HTTP头设置为OAuth2来进行身份验证。是的,我提供的链接就是您想要查看的。usename和password作为表单URL编码数据(以及授权类型)发送到正文中,
客户端id:client\u secret
(当然是实际值)在
授权
标题中进行Base64编码。请参考我提供的资源链接您是否需要使用Oauth 1.0或2.0?从你的问题很难判断。1.0使用“消费者密钥”和“消费者秘密”(所以我认为可能是1.0),但它需要重定向(可能不是)。2.0不需要重定向(好的),但使用“客户端id”和“客户端机密”(不符合要求)。请澄清,以获得进一步的帮助。请查看OAuth 2.0规范中的。我相信这就是说明所要求的。它显示了一个示例令牌请求,其中客户机id(api密钥…可能)和客户机机密被base64编码到授权头中。你可能想向你的导师或给你布置作业的人澄清这一点。也se