【问题标题】:Return a authentication token返回一个身份验证令牌
【发布时间】:2018-04-23 18:40:27
【问题描述】:

我在我的rails-api 应用程序中使用devise_auth_token gem。我在我的应用程序中使用了omniauth_google_oauth2 gem 进行身份验证,但它非常有问题,所以我决定采用不同的方法。

我的 api 应用程序中有一条会响应的路由

{ "url": google-oauth-login-url }

前端应用程序使用该路由将其放入使用 google btn 的登录中。

用户点击 btn 后,他们将被重定向到 google oauth 页面,填写详细信息后,他们将被重定向到带有 url 中的 google 代码的前端主页。

前端应用程序将使用代码向 api 服务器发送请求,服务器将再次向 google 服务器请求以将该 google 代码交换为访问令牌、刷新令牌等。

服务器收到这些令牌后,再次向 google 服务器发出另一个请求以获取用户配置文件。

在获得用户个人资料信息后,我不知道如何注册用户。

如何注册?注册后,如何登录或向前端应用发送身份验证令牌?进行 api 调用时,将在每个标头中使用身份验证令牌。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails authentication devise


    【解决方案1】:

    我必须深入研究 gem 代码才能做到这一点

    def log_in_or_create_employee(user_info)
        @resource = Employee.find_by email: user_info["emails"][0]["value"]
        if @resource.nil?
            password = Devise.friendly_token[0,10]
            @resource = Employee.new({
                name: user_info["displayName"], 
                admin: true, 
                first_name: CustomRegex.japanese?(user_info["name"]["givenName"]) ? '' : user_info["name"]["givenName"],
                last_name: CustomRegex.japanese?(user_info["name"]["familyName"]) ? '' : user_info["name"]["familyName"],
                email: user_info["emails"][0]["value"],
                password: password,
                password_confirmation: password
                })
        end
            @client_id = SecureRandom.urlsafe_base64(nil, false)
      @token     = SecureRandom.urlsafe_base64(nil, false)
      @resource.tokens[@client_id] = {
              token: BCrypt::Password.create(@token),
              expiry: (Time.now + DeviseTokenAuth.token_lifespan).to_i
      }
      @resource.skip_confirmation!
            @resource.save!
    
            return render json: {client_id: @client_id, expiry: @resource.tokens[@client_id][:"expiry"],
                                                     token: @token, uid: @resource.uid
                                                    }
    end
    

    我用令牌保存用户并返回访问令牌。

    【讨论】:

      【解决方案2】:

      Registration是将数据存储到数据库的过程。因此,当您获取用户配置文件并将其保存到数据库时,这意味着您已经注册了它。

      我看到sign in 的过程,因为您将此令牌的附加字段保存到用户表并将其发送到前端。所以客户端知道 access_token 并且服务器知道谁是这个令牌的所有者。

      【讨论】:

      • 整洁。按照这个stackoverflow.com/a/4316995/4156793 进行注册。现在我想登录并获取可以传递给前端应用程序的身份验证令牌。我想我可以使用 sign_in 来登录。
      • 不确定,但看起来你是对的。你试过了吗?
      • 我已经尝试了登录哪个有效。但我需要想办法获取令牌并将该身份验证令牌发送到前端应用程序
      • 令牌不存储到用户表吗?我想你可以得到它那里
      • 查看registration_controller int he devise_token_auth gem中的代码,他们正在生成令牌、client_id、uid和到期时间,然后保存它,但对我来说,我没有保存任何这些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多