2016-09-03 13 views
0

のRuby 2.2.4 Railsの5.0.0.1 改造:私はちょうど初心者です認証:RoRのでJWTとAndroid

こんにちは人、

:1.9.0' 1.3.8' オットー私はAndroidスタジオでアンドロイドアプリを作成する作業をしています。そこでは、ユーザーとしてログインしてログアウトすることができます。したがって、 私はJson Web Token(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"}

これはうまくいきましたが、私のRoRサーバーとやりとりするべきAndroidスタジオのログイン機能を実装しようとしました。 私は厳密に、Retrofitを使ってphpサーバで認証するチュートリアル(https://www.sitepoint.com/retrofit-a-simple-http-client-for-android-and-java/)に従った。しかし、私はこれを私のRoRサーバーに実装したいと思っています。それにもかかわらず、私はこのコードを試しました。私は嬉しかったです。プログラムはRuby on Railsサーバーと通信できます。正しい資格情報を使ってアンドロイドアプリにログインした場合は、コンソールで承認されます。

しかし、私はアンドロイドでメッセージがどのように得られているのかわかりません。ログインが成功し、ユーザー名のウェルカムメッセージが表示されました。私が言ったように、長いトークンを返すRoRでJWTを使用します。改装がこのトークンを解釈する可能性はありますか?または、Android用のJSON Webトークンをインストールする必要がありますか?ここでは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 

そして、ここには来て私のアンドロイドアプリの一部です。コードはチュートリアルのものです。

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エンコーディングは、アレイ(ユーザ名、パスワード、メッセージ、はResponseCode)が含まれています。 JWTで同じ配列をRuby on Railsに含めるにはどうしたらいいですか?何か案が?そして、どうやってアンドロイドでメッセージが届くのか、ログインは成功したのですか?

答えて

0

JsonWebToken.encode(user_id: user.id) if userの行では、user_idのハッシュを渡しています。この行に、追加の属性を含めるように拡張することもできます( JsonWebToken.encode(user_id: user.id, name: user.name) if userなど)。

あなたはアンドロイドアプリにJWTライブラリを組み込み、サーバーのレスポンス(Retrofitから取得)をデコードする必要があります。エンコードされた属性にアクセスすることができます。すでにあり、その後、メインの活動に移動し、変数にトークンを保存するものによると

@SerializedName("token") 
private String token; 

String token 

this.token = token; 

public String getToken() { return token; } 

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

+0

アドバイスをいただきありがとうございます。私はあなたの助言を守り、JWTライブラリを実装し、トークンをエンコードすることができます。しかし、私はトークンを取得する方法を知りません。トークンは唯一のアンドロイドコンソールに表示されます:{「auth_token」:「eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc」} D /レトロフィットcom.example.programmingknowledge.login – Peter

+0

を私がアンドロイドアプリで完全なトークンを取得できますか? – Peter

0

あなたServerResponse.javaファイルにそれらの行を追加します。最初、トークン値を取得するための一つの方法があります

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

次に、プロジェクト全体で使用できます。

希望すると助かります!