2015-06-30 114 views
1

我有一個任務,我需要使用電子郵件和密碼來認證用戶並獲取訪問令牌。我有api密鑰,祕密和基本URL。我不需要爲該作業使用重定向網址,因此未提供該網址。我不確定使用哪種方法或哪個庫。我沉浸在豐富的信息中,令我感到困惑。我需要指出正確的方向......任何形式的幫助都會受到歡迎。謝謝Android應用程序的RESTful Api認證

+0

您是否需要使用Oauth 1.0或2.0?你的問題很難說清楚。 1.0使用「消費者密鑰」和「消費者機密」(所以我想可能是1.0),但它需要重定向(可能不是)。 2.0不需要重定向(好),但使用「客戶端ID」和「客戶端密鑰」(不符合要求)。請澄清,以獲得進一步的幫助。 –

+0

它是oauth 2.0。 –

+0

查看OAuth 2.0規範中的[資源所有者密碼憑據授予](http://tools.ietf.org/html/rfc6749#section-4.3)。我相信這是指令要求的。它顯示了一個示例令牌請求,其中客戶端ID(api key ...也許)和客戶端密鑰以base64編碼到授權標頭中。您可能想要與您的教師或任何給予您的任務分清楚。另請參閱[基本身份驗證](https://en.wikipedia。org/wiki/Basic_access_authentication)關於如何正確制定授權標題 –

回答

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(實際上<client_id>:<client_secret>)的base64編碼。

不使用任何外部庫(只是標準的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; 
} 

從那裏,一旦你的道理,任何資源請求你想,你只需要與Bearer <access_token>添加Authorization頭。

+0

這非常有幫助!我想知道你使用BASE64的庫是什麼? –

+0

這是我使用的後端框架中的一個類。它與我做的測試沒有任何關係,但是我只是使用了這個項目,所以我不必爲這個簡單的測試創建另一個項目。這個班對您來說可能沒用。雖然看起來Android也有[Base64類](http://developer.android.com/reference/android/util/Base64.html)。哦,最後一段,我認爲它不符合你的要求。看起來認證方案應該是「OAuth2」而不是「承載者」 –

0

我建議你使用retrofit庫來做到這一點。

假設您的網址爲http://baseurl.com/api,您必須執行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

+0

我試過這是行不通的。改造簡單太簡單了,但是它不適用於我。 –

+1

爲了本練習的目的,請使用此處列出的電子郵件/密碼流來獲取訪問令牌xxxxxxxxxxxxxx。請注意,本練習不需要redirect_uri URL參數,只有用戶名,密碼,client_id和client_secret。您不必關心令牌過期或爲此任務負責刷新,您只對響應的access_token部分感興趣。一旦您爲用戶獲取訪問令牌,任何後續API調用都可以通過將授權HTTP標頭設置爲OAuth2 「。 –