我希望我的 Rails 应用程序充当 OAuth2 提供者。
我对 Ruby 开发比较陌生,但在我看来,用 Ruby 开发 OAuth2 很简单。
我在网上看到很多 OAuth2 库,但不知道如何在 Rails 项目中实现。
请帮我。
我希望我的 Rails 应用程序充当 OAuth2 提供者。
我对 Ruby 开发比较陌生,但在我看来,用 Ruby 开发 OAuth2 很简单。
我在网上看到很多 OAuth2 库,但不知道如何在 Rails 项目中实现。
请帮我。
如果您可以更具体地了解您想要实现的目标,那将会有所帮助。我假设您想授权使用 Oauth2 的用户,例如使用 Google 或 Facebook
我可以推荐设计宝石。
https://github.com/plataformatec/devise
可用于通过许多提供商(例如 facebook)进行授权
https://github.com/mkdynamic/omniauth-facebook
或谷歌
https://github.com/zquestz/omniauth-google-oauth2
更新
facebook身份验证说明
将 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 应用程序,因为您需要应用程序 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 用户
然后将带有以下代码的文件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%>