针对Android应用的RESTful Api身份验证

时间:2015-06-30 20:16:27

标签: android json rest oauth oauth-2.0

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

2 个答案:

答案 0 :(得分:4)

根据您的评论,说明会告诉您使用Resource Owner Password Credentials Grant。您可以在规范中看到example request

 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标头值。阅读Basic Authentication。基本上czZCaGRSa3F0MzpnWDFmQmF0M2JWusername:password的base64编码(实际为<client_id>:<client_secret>)。

不使用任何外部库(只是标准的Java库)来发出请求,您可能会有类似

的内容
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();

我使用的Base64不是标准库类。此外,ObjectMapper不是标准库类。我只是用它来解析对AccessToken类的令牌响应。您可以使用任何您喜欢的解析器。 AccessToken类只包含所有可能的标记值

public class AccessToken {
    public String access_token;
    public String refresh_token;
    public long expires_in;
    public String token_type;
    public String scope;
}

从那里开始,一旦你有了令牌,你想要做出任何资源请求,你只需要在Authorization添加Bearer <access_token>标题。

答案 1 :(得分:1)

我建议您使用retrofit库来执行此操作。

假设您的网址为http://baseurl.com/api,您必须对/ login传递电子邮件和密码执行GET请求。我假设您的API将以JSON形式返回User对象。

Api.java

public interface Api {

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

}

您需要执行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());
    }
});

我希望这个例子可以帮到你。别忘了阅读retrofit documentation