我希望我的Rails应用程序充当OAuth2提供程序。
我对Ruby开发相对较新,但在我看来,简单地在Ruby中开发OAuth2。
我在网上看到了很多OAuth2的自由,但不知道如何在Rails项目中实现。
请帮帮我。
答案 0 :(得分:2)
如果您可以更具体地了解您要实现的目标,那将会有所帮助。我假设您要使用Google或Facebook授权使用Oauth2的用户
我可以推荐Devise gem。
https://github.com/plataformatec/devise
可用于通过许多提供商授权,例如facebook
https://github.com/mkdynamic/omniauth-facebook
或Google
https://github.com/zquestz/omniauth-google-oauth2
更新
facebook auth的说明
将Gem添加到您的Gemfile
gem 'devise'
并从命令行运行:
bundle install
然后运行以下命令
rails generate devise:install
rails generate devise user
rake db:migrate
其中user是您要在
中存储用户信息的模型您需要在模型中添加几个字段
rails generate migration add_columns_to_user email:string provider:string
rake db:migrate
然后创建一个Facebook应用程序,因为您需要App ID和密钥来授权用户
我将此添加到config / initializers / constants.rb
APPID = 'YOUR_APP_ID'
FBKEY = 'YOUR_FB_KEY'
将以下代码添加到config / initializers / devise.rb
require 'devise/orm/active_record'
require "omniauth-facebook"
config.omniauth :facebook, APPID, FBKEY
将以下代码添加到config / routes.rb
的底部devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
确保设备没有添加另一个devise_for路由,如果routes.rb中已存在路由并删除上面的代码,则删除
将以下代码添加到app / models / user.rb文件
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :provider, :uid, :email, :password, :password_confirmation, :remember_me
def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
user = User.where(:provider => auth.provider, :uid => auth.uid).first
unless user
user = User.create( provider:auth.provider,
uid:auth.uid,
email:auth.info.email,
password:Devise.friendly_token[0,20]
)
end
user
end
app / controllers中的添加一个名为users
的目录mkdir用户
然后使用以下代码向用户dir添加文件omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
将以下代码添加到您的视图中
<% if current_user%>
<%= current_user.email %>
<%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
<% else %>
<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>
<% end%>