允许从站点 A 访问站点 B

Allow access to site B from site A

我猜今天常用的术语是"Single Sign On"

请允许我解释一下我的情况。如果我使用了错误的术语或者我的解释不清楚,请原谅我,因为我不是一个特别好的开发人员,也不是一个架构师。

I have Site A (eg. www.siteA.com) and Site B (eg. www.siteB.com)

站点 A 是一个 Java 项目,而站点 B 是一个 Angular JS + Node JS 项目 (MyEAN Stack)。

一个link会在站点A上提供到站点B。但是,只有在站点A上成功登录后才能查看站点B上的页面。

流程是。

  1. Log in on Site A
  2. Click on link to Site B
  3. Site B loads

如果用户尝试访问 www.siteB.com,将不允许他们访问。您必须通过站点 A。因此请求必须至少来自站点 A。 SiteB 目前没有登录页面。

注:- The 2 sites are different domains.

我想知道我应该从哪里开始寻找我应该如何实现它。任何形式的想法都会很棒,因为我一直在阅读和阅读,但还没有找到一个好的起点。可能我看错地方了

单点登录是一种可能性,您可以使用身份服务器与两个截然不同的站点进行通信。有几种可能性,一种常见的可能性是 SAML 技术。其他包括 CAS 和 OAuth。

请在 Google or/and Whosebug 上搜索术语。由于您可以直接控制 这两个站点,如果有更简单的方法,您不需要 使用 SSO。 @newman 的回答可能有效。

如果您想与外部应用程序集成,SSO 可能会更好,这对您来说可能重要也可能不重要。请在继续之前考虑您的问题。

您可以使用 JWT 创建授权令牌。它应该从站点 A 重定向发送。之后您应该在站点 B 上创建会话。

使用 JWT(Java 网络令牌) 在 SiteA 上登录后。当用户被重定向到 siteB 时,将向用户提供一个令牌,该令牌将传递到 SiteB。通常令牌在 Header 秒内传递。

进程:

一旦用户登录到 SiteA。用户被提供了一个令牌(JWT)。当用户单击 link 到 SiteB 时,用户将被重定向到类似 www.siteA.com/redirect 的内容。 java 网络服务器收到此请求并作为响应发送新的 link,令牌在 Header 中,状态代码为 301。

注意:- 由于我不是 Java 开发人员并且我不知道您使用的 Java 服务器的类型,因此我提供了 express 示例。我希望你能从那里得到灵感。

router.get('/redirect', function(req, res) {
    var token = 'jsdh98yuhes87e6ywqy2'; // Something Your server have generated

    res.header('Authorization', token);

    res.redirect(301,'http://www.SiteB.com/autologin/');
});

现在在 NodeJS 服务器上使用它。您现在要做的就是验证令牌以验证用户是否从 Java 网站 (SiteA) 重定向。

NodeJS 服务器获取该请求并检查 headers。

app.get('/autologin', function(request, response) {
    let token = request.headers['Authorization'];
    var isValid = false;
    // Your check logic here
    if(isValid){// If Valid redirect to SiteB
        response.cookie('id_token' ,request.headers['x-auth-token'], { maxAge: 9000,expires: 600}); 
        response.redirect(301,'http://www.siteB.com');
    }else{//If not Valid redirect back to SiteA


        return response.redirect(301, "http://www.siteA.com"); 
    }
});

如果令牌有效,用户可以访问网站 www.SiteB.com,否则用户将被重定向回 www.SiteA.com

这个设置起来可能有点麻烦。有一个更简单的方法。

备选:

Java 服务器端登录逻辑是相同的,只是现在将令牌添加为查询参数。

类似于:

www.SiteB.com/autologin?Token=ldkasjodauh21i7ds8yuh

您可以在重定向时直接将其添加为 href link。

设置您的 AngularJS 应用程序以从 URL 获取令牌并向您的 nodejs 服务器或 Java 服务器发出 API 调用以验证令牌。

var token = $location.search().token;
var isValid = false;
// You check logic here
if(isValid){// If Valid redirect to SiteB
    $location.url('http://www.siteB.com'); //$location.path('/') can be used as well
}else{//If not Valid redirect back to SiteA
    $window.location.href ='http://www.siteA.com';
}

Java 服务器示例

package app.servlet;

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseRedirectionServlet extends HttpServlet
{
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws IOException
  {
    String url = 'http://www.siteB.com';
    response.setHeader("token", "kjsydis9d979as8dh87"); //some value that your server is generating

    response.sendRedirect(url);
  }
}

我仍然不知道您在 SiteA 上使用的服务器类型。如果您能提供更多有关您在站点 A 上使用的服务器类型的信息,我将能够更准确地帮助您。