如何使用外部重定向实施Ember简单身份验证

时间:2018-12-08 20:49:16

标签: ember.js saml adfs ember-simple-auth

这是我的工作流程。

  1. 用户按下登录按钮。
  2. 用户被重定向到API,该API重定向到第三方站点(ADFS SAML)上的登录页面。
  3. 用户在此处进行身份验证,然后返回到API,该API对响应进行解码,创建用户和JWT令牌(都存储在数据存储区中),然后使用?token=查询参数将用户重定向到Ember。 / li>

我想做的是将其工作到自定义ember-simple-auth authenticator(和authorizer?)中,以便利用会话和Authorization标头的优美之处在那里。

当前,我破解了一个身份验证器,仅将其重定向到身份提供者。 API工作流程的其余部分正在运行。我正在回程的路由中捕获令牌,并通过对数据库的调用填充User资源。但是我觉得我正在走错路(而且很长)。

有什么想法吗?这是ember-simple-auth-token专为设计的东西吗?

1 个答案:

答案 0 :(得分:0)

我在上个月解决了这个问题。我所做的是

  1. 单击登录名
  2. 重定向到adfs
  3. adfs登录成功->重定向到我的后端
  4. 后端生成具有访问令牌详细信息的sso临时令牌 已经在那里并且只有效2分钟。
  5. 使用带有sso temp令牌参数的GET后端重定向网站
  6. 前端采用sso temp令牌的参数并发表另一篇文章 ajax请求后端
  7. Api将验证sso临时令牌并提供详细信息(访问 令牌和刷新令牌)
  8. 在6中读取发布请求的响应数据,并在ember上更新 使用 authenticate 界面的简单身份验证服务(您可以 使用自定义身份验证器自定义此内容)

这是自定义身份验证器类

import Base from 'ember-simple-auth/authenticators/base';
import {isEmpty} from '@ember/utils';
export default Base.extend({
  authenticate(data) {
    return new Promise((resolve, reject) => {

      if(data.access_token!=null){
        resolve({
          scope: data.scope,
          access_token: data.access_token,
        });
      }else{
        reject();
      }  })

    },

    restore(data) {
      return new Promise((resolve, reject) => {
        if (!isEmpty(data.access_token)) {
          resolve(data);
        } else {
          reject();
        }
      });
    },

  });

我已经创建了一个在前端处理的路由,以获取由后端发送的令牌。因此路由通过get参数获取sso令牌(导致后端无法对emberapp进行发布),因此当路由触发时,我在route中捕获了该参数并再次执行post方法来验证令牌。

我们正在使用Redis生成的令牌。因此,由于这个问题是关于emberjs的,因此我在前端说明了支持您的答案。我也说明了这个概念,以说明您需要做什么。因此,您有责任去挖掘并找到更多有关它的信息。例如如何创建临时JWT令牌,如何对其进行验证,如何使用adfs的声明将您重定向到后端等。我想我为您提出的第一个问题提供了答案 “如何使用外部重定向实施Ember简单身份验证”