zoukankan      html  css  js  c++  java
  • NCC 单点登录

    1.1 第三方单点登录NC Cloud概览

    第三方单点登录的流程:

    1. 客户端向服务端发起登陆NC Cloud请求。
    2. 向NC Cloud服务器注册校验用户登陆和上下文信息。
    3. 如果校验成功NC Cloud服务器响应给客户服务器token信息
    4. 客户服务器将token响应给客户端
    5. 客户端收到token后拼接请求NC Cloud节点的url信息。
    6. NC Cloud收到请求并验证token是否合法,如果合法,则重定向到客户端请求的节点页面。

    1.2 第三方系统单点登录NC Cloud详细流程

    1.1.1 在NC Cloud的系统注册表sm_oauth_security注册第三方系统

    表中各字段含义如下:

    1. CLIENT_ID :第三方系统编码,必需项
    2. CLIENT_NAME: 第三方系统名称,非必需
    3. CLIENT_SECURITY: 第三方系统和NC Cloud共同维护的秘钥对
    4. PK_OAUTH_SECURITY: 主键,
    5. CLIENT_URL: 第三方系统的url (供NC Cloud集成访问第三方系统使用,本环节不需要)
    6. CLIENT_AUTHCLASS: 登录第三方系统授权类 (供NC Cloud集成访问第三方系统使用,本环节不需要)
    7. PK_GROUP:非本环节使用,设置为空

    1.1.2 获取登录token

    通过秘钥对获取登录token,第三方服务访问http://ip:port/service/genThirdPartyAccessToken 同时访问参数为:

    1. ype 获取方式,此方式为固定为 type_security且必需项
    2. dsname 数据源名称,必需项
    3. usercode NC Cloud用户编码,必需项
    4. langcode 多语语种,非必需项,为空默认中文语种
    5. busicentercode 账套编码,非必需项,为空登录时会循环在数据源中查找用户
    6. ts ,第三方系统加签的时间,用来生成校验秘钥对,必需项
    7. client_id第三方系统id,即第一步在sm_oauth_security注册的系统编码,必需项
    8. security第三方由共同维护的秘钥对根据给定的算法自己生成的秘钥值,必需项。 security是通过SHA256加签,其中是根据usercode,ts,client_security和当前系统时间动态拼接的字符串生成
    package com.yomyou.nccloud.oauth2;
    
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    
    import nccloud.security.impl.SignatureTookKit;
    
    import org.apache.commons.codec.binary.Base64;
    
    public class PostThirdPartyAccessTokenTest {
    
        public static void main(String[] args) throws Exception  {
            String dsname = "devlop";
            String usercode = "admin";//nccy用户编码
            String client_id = "portal";//第三方系统id
            String client_security = "123qwe";//第三方秘钥
            String langcode = "";//多语语种
            String busicentercode = "";//业务中心
            String groupcode = "";//集团编码
    
            URL preUrl = new URL("http://127.0.0.1:6500/service/genThirdPartyAccessToken");
            URLConnection uc = preUrl.openConnection();
            uc.setDoOutput(true);
            uc.setUseCaches(false);
            uc.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            uc.setRequestProperty("Content-Length", "10000" );
            uc.setRequestProperty("userid", "admin");
            HttpURLConnection hc = (HttpURLConnection) uc;
            hc.setRequestMethod("POST");
            OutputStream os = null;
            DataOutputStream dos = null;
            String returnFlag = "";
            InputStream is = null;
            try {
                StringBuffer sb = new StringBuffer();
                String security = genKey(usercode,usercode + client_security + (System.currentTimeMillis() + "").substring(0, 6));
                sb.append("type=type_security&dsname="+dsname+"&usercode="+usercode+"&client_id="+client_id+"&security="+security);
                os = hc.getOutputStream();
                dos = new DataOutputStream(os);
                dos.writeBytes(sb.toString());
                dos.flush();
    
                is = hc.getInputStream();
                int ch;
                while ((ch = is.read()) != -1) {
                    returnFlag += String.valueOf((char) ch);
                }
                System.out.print(returnFlag);
            } catch (Exception e) {
    
            } finally {
                if (dos != null) {
                    try {
                        dos.close();
                    } catch (Exception e2) {
                    }
                }
                if (os != null) {
                    try {
                        os.close();
                    } catch (Exception e2) {
                    }
                }
                if (is != null)
                    try {
                        is.close();
                    } catch (Exception e2) {
                }
            }
    
        }
    
        private static String genKey(String userid,String key) throws Exception{
            return new Base64().encodeToString(SignatureTookKit.digestSign(userid.getBytes(), key.getBytes()));
        }
    
    }
    

      

    访问NCC资源

    提供登录NC Cloud系统URL,token是从第二步成功返回结果,该值默认保留1分钟,超时或使用过一次则失效。 URL信息如下: http://ip:port/uap/rbac/thirdpartylogin/main/index.html?accesstoken=xxx &redirect_uri=http://ip:port/nccloud。 ip和port是NC Cloud的服务地址的ip和端口号。 http://ip:port/uap/rbac/thirdpartylogin/main/index.html为固定地址。 accesstoken=xxx为(4)中获取的临时token 。 redirect_uri=http://ip:port/nccloud为成功登录后要重定向的地址,如后面为空,默认跳到工作桌面。如果是列表或卡片节点,需改为节点的url的地址。如果是审批详情页面,需要客开,因为审批详情页面的url不同其他页面,需要向NC Cloud服务器请求获取。拼接完成访问url时,NC Cloud服务器收到该请求,会验证token和用户登录NC Cloud权限,验证通过则重定向到redirect_uri。

  • 相关阅读:
    使用redis配置分布式session
    邮件发送整合
    Spark基础-scala学习(八、隐式转换与隐式参数)
    QMQ去哪儿网-mq中间件(启动失败)
    Spark基础-scala学习(七、类型参数)
    JMH实践-代码性能测试工具
    Spark基础-scala学习(五、集合)
    [JavaWeb基础] 012.Struts2 自定义标签使用
    html5学习之路_003
    [Objective-C] 017_UI篇_UIView(中)
  • 原文地址:https://www.cnblogs.com/zhongxiaoze/p/13877116.html
Copyright © 2011-2022 走看看