的Ruby 2.2.4 Rails的5.0.0.1 改造:1.9.0' 奧托:1.3.8'認證:智威湯遜在回報率和Android
你好的人,
我只是一個初學者編程,我有任務使用Android Studio創建一個Android應用程序,您可以在其中以用戶身份登錄和註銷。因此 我使用Json Web令牌(JWT)在RoR 5 API中編寫了一個基於令牌的認證。本教程幫助了我:http://tutorials.pluralsight.com/ruby-ruby-on-rails/token-based-authentication-with-ruby-on-rails-5-api)。在正確的憑據捲曲後,我終於收到令牌:{"auth_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE0NjA2NTgxODZ9.xsSwcPC22IR71OBv6bU_OGCSyfE89DvEzWfDU0iybMA"}
現在,此後工作正常,我嘗試在android studio中實現登錄功能,它應該與我的RoR服務器進行交互。 我嚴格遵循了一個教程(https://www.sitepoint.com/retrofit-a-simple-http-client-for-android-and-java/),該教程使用Retrofit進行PHP服務器驗證。但是我想爲我的RoR服務器實現這一點。不過,我嘗試了這個代碼。我很高興,該程序可以與我的Ruby on Rails服務器進行通信。如果我使用正確的憑證登錄Android應用程序,我會在控制檯上看到它將被接受。
但是我不知道我是如何在android上得到消息的,即登錄成功後再加上一個帶有用戶名的歡迎消息。正如我所說的,我在RoR中使用JWT,這給了我們很長的回憶。翻新是否有可能解釋這個標記?或者我需要安裝JSON Web Token for android?下面是Ruby on Rails中的代碼的一部分:
應用/命令/ authenticate_user.rb
class AuthenticateUser
prepend SimpleCommand
def initialize(email, password)
@email = email
@password = password
end
def call
JsonWebToken.encode(user_id: user.id) if user
end
private
attr_accessor :email, :password
def user
user = User.find_by_email(email)
return user if user && user.authenticate(password)
errors.add :user_authentication, 'invalid credentials'
nil
end
end
的lib/json_web_token.rb
class JsonWebToken
class << self
def encode(payload, exp = 24.hours.from_now)
payload[:exp] = exp.to_i
JWT.encode(payload, Rails.application.secrets.secret_key_base)
end
def decode(token)
body = JWT.decode(token, Rails.application.secrets.secret_key_base)[0]
HashWithIndifferentAccess.new body
rescue
nil
end
end
end
這裏來一我的Android應用程序的一部分,其代碼來自我遵循的教程:
public class Communicator {
private static final String TAG = "Communicator";
private static final String SERVER_URL = "http://127.0.0.1/retrofit";
public void loginPost(String username, String password){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(SERVER_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
Interface communicatorInterface = restAdapter.create(Interface.class);
Callback<ServerResponse> callback = new Callback<ServerResponse>() {
@Override
public void success(ServerResponse serverResponse, Response response2) {
if(serverResponse.getResponseCode() == 0){
BusProvider.getInstance().post(produceServerEvent(serverResponse));
}else{
BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage()));
}
}
@Override
public void failure(RetrofitError error) {
if(error != null){
Log.e(TAG, error.getMessage());
error.printStackTrace();
}
BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage()));
}
};
communicatorInterface.postData("login", username, password, callback);
}
public void loginGet(String username, String password){
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(SERVER_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
Interface communicatorInterface = restAdapter.create(Interface.class);
Callback<ServerResponse> callback = new Callback<ServerResponse>() {
@Override
public void success(ServerResponse serverResponse, Response response2) {
if(serverResponse.getResponseCode() == 0){
BusProvider.getInstance().post(produceServerEvent(serverResponse));
}else{
BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage()));
}
}
@Override
public void failure(RetrofitError error) {
if(error != null){
Log.e(TAG, error.getMessage());
error.printStackTrace();
}
BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage()));
}
};
communicatorInterface.getData("login", username, password, callback);
}
}
這是來自android教程的Php腳本。也許我需要將此轉換爲紅寶石
<?php
//Post Method here
if(isset($_POST['method']) == 'login'){
$username = $_POST['username'];
$password = $_POST['password'];
if($username == "admin" && $password == "admin"){
$response = array('returned_username' => "-admin-",
'returned_password' => "-admin-",
'message' => "Your credentials are so weak [USING_POST]!",
'response_code' => "1");
echo json_encode($response);
}else{
$response = array('response_code' => "-1",
'message' => "invalid username or password");
echo json_encode($response);
}
}
PHP中的json編碼包括一個數組(用戶名,密碼,消息,響應代碼)。我如何將包含JWT的相同數組放在rails上的ruby中?任何想法?以及我如何在android上得到消息,登錄成功
非常感謝您的建議。我遵循您的建議並實施了JWT庫,現在可以對令牌進行編碼。但我不知道如何獲得令牌。令牌只出現在Android控制檯:com.example.programmingknowledge.login d /改造:{「AUTH_TOKEN」:「eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc」} – Peter
我怎樣才能在我的Android應用程序完全令牌? – Peter