当前位置: 首页 > 知识库问答 >
问题:

DESVICE、DESVICE\U token\U auth和ng token auth的身份验证问题

孙泳
2023-03-14

我有点困了,还没有找到解决办法。我有一个rails站点,它的前端使用designe,api使用designe\u token\u auth。前端使用服务器端呈现页面和api调用的组合向用户显示数据。如果我使用纯角度登录,登录表单最终会起作用(ushally 2-3提交):

%div{'ng-controller'=>'logInCtrl'}
  %h2 Log In
  %div{:layout=>'column'}
    %div{:flex=>20}
    %div{:flex=>60, :layout=>'column'}
      = form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
        %div{:layout=>'column'}
          %md-input-container
            =f.label :login
            %input{'ng-model'=>'loginForm.login', :autofocus => 'true'}
          %md-input-container
            = f.label :password
            %input{:type=>'password', 'ng-model'=>'loginForm.password', :autocomplete => 'off'}

          %md-input-container
            %md-button.md-raised.md-primary{'ng-click'=>'submitMe()'}
              -#{:type=>'submit'}
              %md-icon.mdi.mdi-account-key
              Log In

:coffee
  myApp.controller 'logInCtrl', ($scope, $resource, $http, $mdDialog, $auth ) ->
    $scope.submitMe = () ->
      $auth.submitLogin($scope.loginForm).then( (resp)->
        location.replace('/users/sign_in')
      )

如果我使用标准的post方法,服务器会呈现正确的信息,但没有为ng token auth设置令牌。我可以使用以下方法在会话#创建时手动生成和发送令牌头:

  # POST /resource/sign_in
  def create
    super do |user|
      newAuth = user.create_new_auth_token
      response.headers.merge!(newAuth)
    end
  end

我对这种方法的问题是ng-tonic-auth从不从标头中获取令牌,因为它没有发出请求。我一直在寻找一种手动设置令牌标头的方法,但没有运气。

--作为另一方,我最终将转向oauth解决方案,因此我使用的任何解决方案都需要移植到该解决方案我应该提到,服务器端渲染负责设计元素以及打开和关闭功能。我还使用current\u user的元素根据用户位置设置表名的子集。

共有1个答案

徐秋月
2023-03-14

经过一些研究和一段时间后,我想出了一个可行的解决方案,尽管有点老套。

当designe创建新会话时,将调用重定向到配置文件中指定的路由,因此设置任何变量都将丢失。第二个问题是,ng token auth只会设置和使用在登录功能期间设置的令牌,因此不会检测到通过页面标题简单发送令牌(这是浏览器的限制,而不是代码的限制)。

在为我的用户尝试了使用ng token auth和标准Deviate身份验证的不同迭代之后,我得出结论,最好先使用Deviate授权用户,然后以某种方式使用ng token auth设置令牌;所以我开始研究ng token auth在通过登录收到令牌时实际做了什么。事实证明,它设置了两个cookie:

currentConfigName |默认|域|/|扩展日期

auth\u标头| url编码的令牌数据|域|/| exp日期

现在的问题是如何将新生成的令牌传递给前端;这使我们比我想象的要简单。由于Rails中调用之间保留的唯一数据是会话数据,因此我决定在会话数据中添加一个标志来表示我的Application ationController以生成一个新密钥是有意义的。

首先,我扩展了designe::sessioncontroller#create

def create
  super do |user|
    session[:token] = true
  end
end

这将名为Token的会话变量设置为True。比在Application ationController中我添加了:

 before_filter :set_token

  def set_token
    if session[:token] && user_signed_in?
      newAuth = current_user.create_new_auth_token
      response.headers.merge!(newAuth)
      @auth_token = newAuth
      session.delete(:token)
    else
      @auth_token = false
    end
  end

此before筛选器查找会话[:token],如果set调用,则设计token auth'screate\u new\u auth\u token函数以“登录”当前用户。此标题信息既会写入传出页面标题,也会分配给变量auth\u token。最后在views/laoyouts/applicationhtml中。haml此代码块添加到%正文标记的右侧

- if @auth_token
  :coffee
    myApp.controller 'cookieController', ($scope, $resource, $http, $mdDialog, $auth, ipCookie ) ->
      ipCookie('auth_headers', "{\"access-token\": \"#{@auth_token['access-token']}\",\"token-type\": \"Bearer\",\"client\": \"#{@auth_token['client']}\",\"expiry\": \"#{@auth_token['expiry']}\",\"uid\": \"#{@auth_token['uid']}\"}", {path: "/",expires: 9999,expirationUnit: 'days',secure: false})
      ipCookie('currentConfigName', 'default', {path: "/",expires: 9999,expirationUnit: 'days',secure: false})
  %div{'ng-controller'=>'cookieController'}

这将添加一个空的div标记和角控制器,该控制器使用写入@auth_token的数据和ipCookie函数(由ng-Token-auth要求)来编写必要的cookie。

几点注意事项

  • 我将代码块添加到主布局页面和ApplicationController中,因为当用户登录到我的站点时,他们可能会被重定向到两个页面之一,具体取决于他们的凭据。这确保了无论发送到哪个页面,都会生成代码标记并插入代码块
  • 我知道可能有更好的方法来处理cookie的生成,而不是创建一个空div并为其分配一个控制器。我愿意接受更优雅的解决方案

 类似资料:
  • 问题内容: 确保GWT + Tomcat应用程序执行身份验证和授权的最佳策略是什么? 问题答案: 有两种基本策略: 确保入口点; 保护远程服务。 最简单的方法是使用常规的Web应用程序安全工具来限制对GWT生成的html / js文件的访问: 春季安全; web.xml约束。 这样可以让您拥有eg 和。 保护远程服务 如果上述解决方案还不够,您可以进行更深入的研究。我已经通过Spring Secu

  • 我是Apache Shiro的初学者。我一直在跟踪文档和许多其他教程,博客等,但我就是无法使身份验证工作。当我尝试使用有效的用户名和密码登录时,总是会引发。我正在使用DynamoDB作为存储用户凭据的自定义领域,但我真的不认为这有什么关系。显然,我存储和/或执行凭据匹配的方式是不正确的。以下是我的设置:

  • 问题内容: 我试图让我的自定义Java应用程序使用我们的Active Directory服务器进行身份验证,但由于某种原因我无法使其正常工作。谁能看到为什么呢?这是我的方法如下: 结果: 问题答案: 你尝试过这种方式吗? 也更换 与

  • 我正在开发一个Web应用程序 然而,我在尝试允许用户通过注册链接注册时遇到了一个问题。如果用户未经身份验证,则无法访问注册表的链接(“showRegistrationForm”) 有人能洞察为什么会发生这种情况吗?我在下面包含了我的安全配置中的代码片段

  • 尝试将ember应用程序连接到oauth2身份验证服务时,获得一个[error=“unauthorized”,error_description=“访问此资源需要完全身份验证”]。如有任何建议,我们将不胜感激。我花了几天时间想解决这个问题,但没有效果。 下面是app.js中的代码

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工