2016-09-03 31 views
0

的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上得到消息,登錄成功

回答

0

在行JsonWebToken.encode(user_id: user.id) if user中,您傳遞的是帶有密鑰user_id的散列。您可以擴展該行以包含其他屬性,有點像 JsonWebToken.encode(user_id: user.id, name: user.name) if user

然後,您需要在Android應用程序中包含JWT庫並解碼服務器響應(從Retrofit獲得),並且您將能夠訪問您編碼的屬性。

+0

非常感謝您的建議。我遵循您的建議並實施了JWT庫,現在可以對令牌進行編碼。但我不知道如何獲得令牌。令牌只出現在Android控制檯:com.example.programmingknowledge.login d /改造:{「AUTH_TOKEN」:「eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc」} – Peter

+0

我怎樣才能在我的Android應用程序完全令牌? – Peter

0

有檢索標記值,首先添加這些行到ServerResponse.java文件的一種方法:

@SerializedName("token") 
private String token; 

String token 

this.token = token; 

public String getToken() { return token; } 

public void setToken(String token) { 
    this.token = token; 
} 

根據什麼已經存在,然後去然後主要活動和令牌存儲在一個變量例如:

String auth_token = serverEvent.getServerResponse().getToken() 

接下來,您可以將其設置爲private final並將其用於您的項目。

希望它有幫助!