如何为你的Rails应用配置Devise和OmniAuth

2024-04-19 09:12

本文主要是介绍如何为你的Rails应用配置Devise和OmniAuth,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

大多数 Ruby on Rails 应用程序都需要用户注册和身份验证机制。从头开始开发这些需要大量的时间和精力 - 幸运的是,有 Devise。使用 Devise gem,您可以在几分钟内设置一个完整的用户身份验证系统。

但是,您可以通过允许用户在不创建新帐户的情况下访问您的应用程序来让他们更加满意。他们可以简单地使用他们现有的 Facebook、Twitter、Amazon 或 DigitalOcean 帐户登录。事实上,您可以支持任何流行的 OAuth 服务提供商进行身份验证。OAuth 支持由 OmniAuth gem 提供。在本教程中,我们将创建一个简单的应用程序,该应用程序同时使用了 Devise 和 OmniAuth。

先决条件

在开始之前,请确保您的主机上安装了 RVM、Ruby 和 Rails 的最新版本。如果没有,请按照这里的说明操作:如何在 Ubuntu 12.04 LTS 上使用 RVM 安装 Ruby on Rails。

本教程已经在 Ruby 2.1.2 和 Rails 4.1.5 上进行了测试。

步骤 1 - 创建一个新的 Rails 应用程序

建议您将所有的 Rails 应用程序放在一个单独的目录中。

您现在应该创建一个。

mkdir rails_apps
cd rails_apps

在开始发出 Rails 命令之前,您必须初始化 RVM 环境。

如果您在跟随本教程时休息一下,请记住每次重新启动终端会话时都要这样做。

. ~/.rvm/scripts/rvm
rvm use ruby --default

让我们将新应用程序命名为 myapp。创建应用程序后,使用 cd 进入应用程序的基本目录。

rails new myapp
cd myapp

注意:所有 Rails 命令都应该在应用程序的目录内运行,本例中是 ~/rails_apps/myapp。

步骤 2 - 向 Gemfile 添加所需的 Gems

我们将需要 Devise 和 OmniAuth gems。此外,您还需要一个单独的 gem 来支持每个 OAuth 服务提供商。对于本教程,我们将支持使用 DigitalOcean 登录,因此我们需要 omniauth-digitalocean gem。

将以下行添加到文件 ~/rails_apps/myapp/Gemfile 的末尾。您可以使用 nano 作为您的文本编辑器。

gem 'therubyracer'
gem 'devise'
gem 'omniauth'
gem 'omniauth-digitalocean'

您将需要类似的 gems 来支持其他提供商。例如,要支持 Facebook,您将需要 omniauth-facebook。以下是一些供您参考的类似 gems:

  • Twitter - omniauth-twitter
  • Amazon - omniauth-amazon
  • Google - omniauth-google
  • Github - omniauth-github

安装新添加的 gems。

bundle install

步骤 3 - 向应用程序添加基本功能

让我们快速为这个应用程序添加一些页面进行测试。最终,这些页面将只能在登录后访问。

我们可以使用 Rails 的脚手架功能来实现这一点。使用 rails g scaffold 命令,我们只需指定有关模型的详细信息,Rails 就会生成完全功能的页面来执行该模型的 CRUD(创建、读取、更新、删除)操作。换句话说,所有相关的控制器和视图都会被生成,以及模型文件。

rails g scaffold Product name:string price:integer description:text
rake db:migrate

接下来,我们需要定义这个应用程序的根。

编辑 ~/rails_apps/myapp/config/routes.rb,并在现有的资源行下面添加一行 root 'products#index' 来指定应用程序的根。您可以忽略所有被注释掉的行。完成后,文件中的活动行将如下所示:

Rails.application.routes.draw doresources :productsroot 'products#index'
end

现在,测试您的应用程序。通过输入以下命令启动开发服务器:

rails s

在浏览器中访问 http://localhost:3000。如果您是远程开发,请用适当的 IP 地址或域名替换 localhost3000 是开发服务器的默认端口号。

目前,不需要登录。通过点击“New Product”添加一些产品。一旦您满意您的应用程序按预期工作,返回终端并按 Ctrl+C 停止服务器。

步骤 4 - 设置 Devise

输入以下命令以添加 Devise 身份验证支持。

rails generate devise:install
rails generate devise User
rake db:migrate

这将添加登录和注册表单以及所有相关的逻辑。

我们的应用程序现在具有基本的身份验证系统,用户可以注册自己,然后登录。然而,所有页面仍然是直接可访问的。为了改变这一点,编辑 ~/rails_apps/myapp/app/controllers/application_controller.rb,并将 authenticate_user! 添加为在提供任何页面之前执行的操作。

class ApplicationController < ActionController::Baseprotect_from_forgery with: :exceptionbefore_action :authenticate_user!
end

如果您愿意,您可以再次使用 rails s 命令启动开发服务器,并通过访问 http://localhost:3000/(同样,使用您自己的域名或 IP 地址)来查看这些新添加的页面。您应该会看到一个看起来像这样的页面:

!登录页面

您可以通过访问 http://localhost:3000/users/sign_up 注册为新用户。

第五步 - 更新用户模型以支持 OmniAuth

如果你重新启动了服务器,请使用 CTRL-C 停止它。向 Devise 生成的模型添加一个名为 uid 的新列。

rails g migration AddColumnsToUsers provider uid
rake db:migrate

第六步 - 从 OAuth 服务提供商获取客户端 ID 和客户端密钥

访问服务提供商的网站并在那里注册你的应用程序。所有的服务提供商都有不同的注册流程。对于 DigitalOcean,请参考这里的教程:如何作为用户或开发者使用 DigitalOcean 的 OAuth 认证

在注册过程中,你将被要求提供一个回调 URL。每个提供商都有一个单独的回调 URL。以下是一些流行服务提供商的回调 URL:

  • Digital Ocean: http://localhost:3000/users/auth/digitalocean/callback
  • Facebook: http://localhost:3000/users/auth/facebook/callback
  • Amazon: http://localhost:3000/users/auth/amazon/callback
  • Twitter: http://localhost:3000/users/auth/twitter/callback
  • Google: http://localhost:3000/users/auth/google/callback

请将 localhost 替换为解析到你的 Droplet 的 IP 地址或域名。在注册过程结束时,你将获得你的客户端 ID 和客户端密钥。你将在下一步中使用这些值。

第七步 - 更新 Devise 初始化器

编辑 ~/rails_apps/myapp/config/initializers/devise.rb,在文件底部的 end 行之前添加客户端 ID 和密钥。同时,将 mailer_sender 更新为你自己服务器的名称和用户。除了这两项之外,你不需要做任何其他更改。

编辑后,你的文件应该如下所示(文件中还会有很多注释行):

Devise.setup do |config|#Replace example.com with your own domain nameconfig.mailer_sender = 'mailer@example.com'require 'devise/orm/active_record'config.case_insensitive_keys = [ :email ]config.strip_whitespace_keys = [ :email ]config.skip_session_storage = [:http_auth]config.stretches = Rails.env.test? ? 1 : 10config.reconfirmable = trueconfig.expire_all_remember_me_on_sign_out = trueconfig.password_length = 8..128config.reset_password_within = 6.hoursconfig.sign_out_via = :delete#Add your ID and secret here#ID first, secret secondconfig.omniauth :digitalocean, "db381dc9990be7e3bc42503d0", "5b0824c2722b65d29965f1a1df"
end

第八步 - 更新用户模型

Devise 生成的用户模型必须更改以指定我们想要使用的服务提供商。我们在现有列表中添加了三个项目(:omniauthable, :omniauth_providers => [:digitalocean],不要忘记额外的逗号!)。我们还创建了一个名为 from_omniauth 的新方法,用于提取认证后可用的信息。

编辑后,你的 ~/rails_apps/myapp/app/models/user.rb 应该如下所示:

class User < ActiveRecord::Basedevise :database_authenticatable, :registerable,:recoverable, :rememberable, :trackable, :validatable,:omniauthable, :omniauth_providers => [:digitalocean]def self.from_omniauth(auth)where(provider: auth.provider, uid: auth.uid).first_or_create do |user|user.provider = auth.provideruser.uid = auth.uiduser.email = auth.info.emailuser.password = Devise.friendly_token[0,20]endend
end

保存文件。

第九步 - 添加一个控制器来处理回调 URL

首先,编辑 ~/rails_apps/myapp/config/routes.rb 并更新 devise_for 行以指定将处理回调的控制器的名称。我们简单地称之为 callbacks。你的文件现在应该如下所示(减去注释部分):

Rails.application.routes.draw dodevise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }resources :productsroot 'products#index'
end

然后,创建一个新文件 ~/rails_apps/myapp/app/controllers/callbacks_controller.rb

向其中添加以下代码:

class CallbacksController < Devise::OmniauthCallbacksControllerdef digitalocean@user = User.from_omniauth(request.env["omniauth.auth"])sign_in_and_redirect @userend
end

如果你使用了更多的 OAuth 提供商,你将需要为每个提供商创建一个单独的方法。方法的名称应该与提供商的名称匹配。例如,要添加对 Facebook 的支持,你的方法将使用 def facebook 定义。

你的应用程序现在已经准备就绪。再次启动服务器:

rails s

访问你的主页。由于我们正在测试登录功能,你可能希望在没有存储数据的会话中进行,比如 Chrome 的隐身窗口。你应该会看到一个 使用 DigitalOcean 登录 的链接。点击它。你将被重定向到 DigitalOcean 的登录页面。成功登录后,你将被重定向回你自己的应用程序,并显示产品页面。

!使用 DigitalOcean 登录

结论

现在,您的应用程序拥有了一个现代化的用户身份验证系统,用户可以使用电子邮件地址、社交网络账户或其他流行的服务进行登录。

如果您决定将此应用程序部署到 Droplet 上进行生产环境使用,您可以参考这里的教程:如何使用 DigitalOcean 一键部署镜像启动您的 Ruby on Rails 应用程序。如果您将应用程序添加到新的 Droplet 上,请不要忘记返回到第 6 步,使用您生产服务器的回调 URL 更新您的 DigitalOcean API 设置。

这篇关于如何为你的Rails应用配置Devise和OmniAuth的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917131

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或