15

私は、会社のWebアプリケーションのいくつかで動作することを目的としたoauthプロバイダーを作成しました。これまでうまくいったドアマンの宝石を使っています。

一般的な動作は、ユーザーがクライアントアプリケーションに移動し、プロバイダーにリダイレクトされてサインインし、クライアントアプリケーションがそのユーザーの情報へのアクセスを許可されていることを確認してから、クライアントアプリケーションにリダイレクトされることです。ただし、ユーザーがクライアントアプリケーションを確認する手順はスキップしたいと思います。彼らのためにやりたいので、プロンプトはありません。

ここで見つけたコードを次のようなもので模倣しようとしました。

Doorkeeper::Application.all.each do |application|
  auth_params = {response_type: 'code', client_id: application.uid, redirect_uri: application.redirect_uri}
  client = Doorkeeper::OAuth::Client.find(application.uid)
  authorization = Doorkeeper::OAuth::AuthorizationRequest.new(client, user, auth_params)
  authorization.authorize
end

しかし、それは機能しませんでした。それでも、クライアントアプリの承認/拒否プロンプトがユーザーに表示されます。提案?

4

5 に答える 5

27

OAuthには、Doorkeeperがサポートするこのためのリソース所有者資格情報付与フローがあります。基本的に、ユーザー資格情報(ユーザー名とパスワード)を使用してアクセストークンを要求します。このようにして、ユーザーの確認をスキップし、コールバックURLも必要ありません。

ドアキーパーを構成するには:

Doorkeeper.configure do
  resource_owner_from_credentials do |routes|
    User.authenticate!(params[:username], params[:password]) # change this if needed
  end
end

トークンリクエストの例:

curl -i https://example.com/oauth/token \
     -F grant_type=password \
     -F client_id=<client_id> \
     -F client_secret=<client_secret> \
     -F username=user@example.com \
     -F password=password

OAuthクライアントアプリケーションがRailsアプリケーションの場合、これにoauth2gemを使用できます。

client = OAuth2::Client.new('client_id', 'client_secret', :site => "https://example.com")
access_token = client.password.get_token('user@example.com', 'password')

Doorkeeperswikiも参照してください。

https://github.com/applicake/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow

于 2012-07-31T13:45:45.820 に答える
13

Doorkeeper 0.6.7は、これを行うための構成オプションを提供します。

ドアキーパーを構成するには:

Doorkeeper.configure do
  skip_authorization do
    true
  end  
end
于 2013-02-22T17:05:31.780 に答える
13

追加することで、すべてのクライアントアプリのいずれかをアプリに事前承認させることができます

skip_authorization do
  true
 end

ドアキーパー初期化子に、またはドアキーパーテーブルにブール値preauthorizedを追加することでアプリごとに。oauth_applications次に、次のようなものを初期化子に追加します。

skip_authorization do |resource_owner, client|
  client.application.preauthorized?
 end
于 2013-10-08T23:57:47.193 に答える
2

アプリケーションのトークンを取得して、その確認画面をバイパスして/ oauth/tokenに投稿することができます。お好みに合わせて微調整してください。

クライアントアプリケーションの場合:

require 'rest-client'
require 'json'

client_id = '4ea1b...'
client_secret = 'a2982...'

response = RestClient.post 'http://localhost:3000/oauth/token', {
  grant_type: 'client_credentials',
  client_id: client_id,
  client_secret: client_secret
}
token = JSON.parse(response)["access_token"]

これで、リソース所有者を必要としない保護されたリソースへのアクセスを要求できます。

RestClient.get 'http://localhost:3000/api/v1/profiles.json', { 'Authorization' => "Bearer #{token}" }

ソース:https ://github.com/applicake/doorkeeper/wiki/Client-Credentials-flow

于 2013-02-22T19:45:27.490 に答える
0

あなたの質問から、あなたの会社には多くのアプリケーションがあり、これらすべてに1つの認証プラットフォームを使用したいと考えているようです。

ここで、ログイン画面を1か所(おそらく認証システムアプリ)に配置したいと思います。その場合、このためにリソース所有者資格情報付与フローを使用することはできません。

最善の方法は、信頼できるクライアントのリストを用意し、次のように条件付きで承認をスキップすることです。

# config/initializers/doorkeeper.rb

Doorkeeper.configure do
  skip_authorization do |resource_owner, client|
    client.uid == "client application id of the trusted app goes here"
  end
end

クライアントに独自のログイン画面を持たせたい場合は、Resource OwnerCredentialsGrantフローで十分です。

于 2018-09-27T17:25:19.140 に答える