の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に含めるにはどうしたらいいですか?何か案が?そして、どうやってアンドロイドでメッセージが届くのか、ログインは成功したのですか?
アドバイスをいただきありがとうございます。私はあなたの助言を守り、JWTライブラリを実装し、トークンをエンコードすることができます。しかし、私はトークンを取得する方法を知りません。トークンは唯一のアンドロイドコンソールに表示されます:{「auth_token」:「eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc」} D /レトロフィットcom.example.programmingknowledge.login – Peter
を私がアンドロイドアプリで完全なトークンを取得できますか? – Peter