Devise
/Rails
アプリにiOS
を使用してユーザー認証を実装しようとしています。私は主にDeviseの「 user 」であり、純粋なWebアプリに使用していたため、問題が発生しました。そのため、背後で何が起こっているかについてそれほど気にする必要はありませんでした。シーン。 APIベースのアプリの認証を構築する必要があるので、まったく別の世界です。
このトピックを扱っているウェブ上のすべてのシングルチュートリアルを読みましたが(token_authenticatable
が非推奨になったため、ほとんどが古くなっています)、まだ問題があります。私が何をする必要があるかを理解する。
私はまた、元のGitHub
の要点について読んでいます この問題 それでも彼らが何について話しているのか理解していません。
Devise
の「 user 」に過ぎなかった私のような人がいると確信しているので、背後で何が起こっているのかよくわかりません。シーン。
誰かがモバイルアプリにAPIベースの認証システムを実装するための簡潔なソリューションを提供できますか?それほど複雑にすることはできません。Devise
はRails generate
を実行するだけだったので、以前はとても素晴らしかったのですが、これは私にとって悪夢でした。
私はあなたが望むのと同じことに取り組んでいます、
このためには、単純なDeviseではなくトークン認証を使用する必要があります。gemfileに次のgemを追加します
# Use device for authentication
gem 'devise'
gem 'simple_token_authentication'
ドキュメントに従ってください simple_token_authentication
Use Api like this
curl -v https://example.com/users/sign_in -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d '{"user": {"login": "7838712847" ,"password": "8489", "mobile_type": "ios", "mobile_key": "APA91bG6G4UvjeCWvb8mMAH1ZO3I-8FB3nkRPyCHnwZiXgd16HK18GgoV5n7gjJtZNs038iaFGutzdxnhes3WyaXEX52-xmOyvuEK8S1abBdpuhD9AD5bzLWeu-1Ow_yZRTVg3Nypz1z"}}'
I am using mobile number to login so customize gem according your need
それが機能していない場合は私に知らせてください(私にメールしてください:[email protected])
Railsアプリで認証にDeviseを使用する場合、これは私にとって優れたアプローチです。最初にトークンをテストする場合(iOS、Android、...でトークンを設定できます)。 app)を使用して、Webユーザーのデフォルトの認証方法にフォールバックします。
:api_token文字列列を追加して、ユーザーモデルに独自のトークンを追加し、ユーザーごとに一意の値を入力します。一部のユーザーデータ(ID +電子メールなど)のDigest :: SHA1を使用することは良い出発点ですが、一意のトークンを生成することに関しては、好きなだけ夢中になることができます(そしてそうすべきです)。
そのトークンに対する認証のメソッドを作成します。簡単にアクセスできるようにメインのApplicationControllerに追加できます(コントローラーのプライベートセクションにメソッドを配置することを忘れないでください)。
def authenticate_user_by_token
@api_token = request.headers['HTTP_AUTHORIZATION']
if @api_token.present? && @user = User.find_by_api_token(@api_token)
sign_in @user
return @user
else
return false
end
end
次に、(プライベート)メソッドを作成し、このメソッドを、使用しているフィルターメソッドの前にデバイスにチェーンします(たとえば、:authenticate_user!など)。簡単にアクセスできるように、上記の方法と同じコントローラーに配置します。
def authenticate_by_token_or_devise!
return authenticate_user! unless authenticate_user_by_token
end
次に、:authenticate_userからの現在のbefore_filter呼び出しを置き換えます。新しく作成されたものに; :authenticate_by_token_or_devise!、そのように;
before_filter :authenticate_by_token_or_devise!
または、Rails 4( Rails 4:before_filter vs. before_action )から始めて、before_actionを使用します。
before_action :authenticate_by_token_or_devise!
これで、そのトークンをiOSアプリに追加するだけです。アプリで使用するフレームワークによっては、以下のコードとは異なる場合があります。
この例では、AFNetworking( https://github.com/AFNetworking/AFNetworking )を使用しています。これは、AFHTTPRequestOperationManagerでAuthorizationヘッダートークンを設定して、作成するすべてのリクエストに追加されるようにする方法です。
NSString *apiToken = @"your-token-here";
[[_manager requestSerializer] setValue:apiToken forHTTPHeaderField:@"Authorization"];
さらに、次のように、トークンベースの認証のみへのアクセスを許可するbeforeフィルターメソッドを作成できます(たとえば、トークンを使用してのみアクセスしたい/ apiルートのセットがある場合)。
def authenticate_user_by_token!
if !authenticate_user_by_token
render nothing: true, status: :unauthorized and return
end
end
最近、Webアプリ(APIアクセス用)にトークンベースの認証を設定する必要がありました。また、Deviseから削除されたという事実にも遭遇しました。
Simple Token Authentication を使用しましたが、これは非常にうまく機能しました。
最近APIを実装したとき、ラックベースの認証ジェムである Warden を使用するという提案に惜しみなく従いました。私の感覚では、独自の認証を作成する必要のある認証の宝石が壊れていました。しかし、この宝石はちょうどいいレベルのコントロールを提供します。私の唯一の不満は、gemがPOSTパラメータをうまく処理しないことです。 私はそれを回避することができました 、しかしその種の懸念は(IMO)処理されるべきです宝石によって。
これを使用したことで、一般的でない認証を必要とするシナリオには、このgemを強くお勧めします。独自の認証戦略を展開することは、(a)非常に単純であり、(b)他の開発者の仮定に縛られないため、喜びです。
あなたが始めるのを助けるために、 これが私のconfig/initializers/warden.rbファイルです 。
Devisegemとdoorkeepergemを組み合わせて使用すると、Web認証とモバイル認証をサポートできます。
たとえば、deviseを使用してユーザーを登録し、パスワードの忘れや電子メールの確認フローを処理しました。モバイルクライアントの場合、APIを保護するためのoauth2プロバイダーとしてドアキーパーgemを使用しました。ドアキーパーgemでサポートされているoauth2グラントフローはたくさんあります。それらをご覧になることをお勧めします。
ここに リンク !始めるには