SPA(Ember)身份验证与后端

2024-09-26 18:14:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在一个带有后端的SPA中实现正确的身份验证。在

我在看两个不同的前端: 1水疗中心余烬 2移动应用程序

我正在尝试设计一个同时为两者服务的后端(在Rails或Python中,还没有决定)。我希望通过谷歌或Facebook进行认证,也就是说,我不需要维护单独的用户注册,但我仍然需要维护用户,因为我希望能够在一天结束时“合并”来自谷歌和Facebook的认证。出于可伸缩性的原因,我还希望后端完全无状态。我也希望在客户端尽可能多的做,以节省来自后端的负载。在

我的问题如下:

  1. 我将在SPA或移动应用程序中请求身份验证令牌。我应该将其转换为服务器端的访问令牌还是客户端的访问令牌?我需要授权后端请求,我需要无状态地这样做。我的想法是在前端执行所有操作,并将访问令牌传递给每个后端请求,同时在服务器端进行验证,但我不确定这是否是一种有效的方法。

  2. 我希望能够合并Google和Facebook认证,这方面的最佳实践是什么?我计划在服务器端维护一个用户注册表,检查来自授权后端请求的电子邮件地址,并合并用户,如果有匹配的电子邮件地址。最佳实践是什么?在Python/Flask或Ruby或Rails中是否有支持这一点的库?

谢谢!在


Tags: 用户身份验证应用程序客户端facebook电子邮件状态地址
1条回答
网友
1楼 · 发布于 2024-09-26 18:14:05

我不太清楚你说的“无国籍”是什么意思。显然,您需要一些数据库来存储用户的数据(否则根本不需要后端)。所以数据库是你的状态。从定义上讲,HTTP协议是无状态的,所以除了在数据库中存储数据外,您不能通过其他方式真正实现有状态。在

I will request an authentication token in the SPA or in the mobile app. Should I convert this to an access token on the server side or on the client side?

如果您不需要代表用户使用Google/Facebook(而且您的措辞表明您不需要),那么您根本不需要将auth_令牌转换为server_令牌。在

你只需要调用Google/Facebook API(Ruby有两个库,所以基本上只需一行代码),就可以获得社交网络的用户ID和用户电子邮件。在

然后将ID+电子邮件保存在数据库中,并将内部服务器令牌(只是随机字符串)提供给用户。您自己生成字符串并将其交给客户机。在

如果用户从另一个设备登录(即,它提供给您auth_token),您可以使用该设备发现用户的电子邮件属于某个已注册的用户,则可以返回现有的内部令牌,或者生成新的令牌并将其绑定到现有用户(取决于您的优先级-实现/维护简单性的高安全性)。在

I want to be able to merge Google and Facebook authentications, what are the best practices for that?

Facebook向你保证,如果它向你发送用户电子邮件,那么它就保证了该电子邮件属于给定用户。显然,谷歌也这么做。所以你只要通过电子邮件把它们合并。在

您不需要一些特殊的库,因为这是一个简单的操作,您可以使用自己选择的语言编写代码。在

我将按照以下方式组织数据库中的所有内容:

用户表

id
email

认证表

^{pr2}$

当用户登录时,会创建身份验证对象。如果没有用户使用此类电子邮件,则创建该用户。如果有用户,它将绑定到身份验证对象(都通过user_id字段)。在

关于访问令牌的说明

如果您确实计划与社交网络交互(除了验证用户身份外),您应该将auth_token换成{}。server_token是访问社交网络API的“永久”(嗯,有点)授权令牌,而{}的寿命非常有限(如果您没有获得{},某些API调用可能会受到限制)。在

尽管如此,server_token可能会过期(或者用户可以调用他们对应用程序的访问权限),因此您应该提前计划检测这种情况,并在需要时重新获取令牌/授权。在

构建Rails应用程序时的关键点

在Rails中,为了创建表,您需要编写migrations

gem install rails
rails new my_project
cd my_project
rails generate migration create_users
rails generate migration create_authentications

这将生成项目文件夹结构和两个迁移文件,您需要填写这些文件:

^{4}$

然后生成“models”来处理与数据库相关的操作:

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :authentications
end

# app/models/authentication.rb
class Authentication < ActiveRecord::Base
  belongs_to :user
  before_create :set_token
  after_commit :create_user_if_needed

  private

  def set_token
    self.token = SecureRandom.urlsafe_base64(20)
  end

  def create_user_if_needed
    unless self.user.present?
      self.user.create(email: self.email)
    end
  end
end

并编写“controller”来处理来自用户的请求,其中包含一个方法:

# app/controllers/login_controller.rb
class LoginController < ActionController
  # Login via Facebook method
  def facebook
    token = params.require(:auth_token)

    # we will use Koala gem
    profile = Koala::Facebook::API.new(token).get_object('me', fields: 'email')

    # user is created automatically by model
    authentication = Authentication.where(social_network: 'facebook', social_uid: profile['id'], email: profile['email']).first_or_create
    authentication.update(...) # set ip and device
    render json: {token: authentication.token}
  end

  # This one you'll have to write yourself as an exercise :)
  def google
  end
end

当然,您需要为您的操作设置routes

# config/routes.rb

post "login/:action", controller: 'login'

并将Koala(或者其他任何你将用来管理外部api的东西,这些api已经存在好的Ruby包)添加到Gemfile

# Gemfile
gem 'koala'

然后在你的终端运行中:

bundle install
rails server

你的应用程序正在运行。好吧,你需要先设置你的Facebook和Google应用程序,获取开发者密钥,并授权localhost接受{}。在

基本上,就这样。在

相关问题 更多 >

    热门问题