Groovy代码示例


class Tewfeb implements AuthProviderPlugin {
    //蓝凌接口地址前缀-必填  SSO 地址
    private static String PREFIX_URL = "第三方单点登录地址"
    //应用ID-必填          OAuth client_id
    private static String CLIENTID = ""
    //应用密钥-必填         OAuth client_secret
    private static String CLIENTSECRET = ""
    //蓝凌OA关键字与纷享人员字段上的映射关系
    private static String Mapping_Field = "employee_number"
    //管理后台申请的单点登录域名
    private static String Domain = ""

    //当前这个函数的函数名
    private static String FunctionName = ""

    //纷享回调地址-必填     访问地址
    private static String redirect_uri = "https://" + Domain + ".my.fxiaoke.com/oauth/sp/callback/" + FunctionName

    private static String logoffUrl = "https://" + Domain + ".my.fxiaoke.com/oauth/sp/logout/" + FunctionName



    /**
     * 登录时打开 {租户域名}.my.fxiaoke.com 跳转的第三方url
     */
    @Override
    String authorize(FunctionContext context, Map<String, List<String>> params) {
      def(boolean error, String reuslt, String errorMessage) = Fx.crypto.URL.encode(redirect_uri)
        log.info("redirect_uri == " + redirect_uri)
        log.info("reusltUrl == " + reuslt)
        log.info("跳转idp登录url--context:"+context)
        final Map<String, String> param = [
                    "client_id": CLIENTID,
                    "redirect_uri" : reuslt,
                    "response_type" : "code"
            ]
        return appendUrl(PREFIX_URL + "/oauth2.0/authorize", param)
    }

    /**
     * 第三方登录完成后的回调函数,一般用于获取用户信息
     * @param params 第三方回调时,URL的参数
     * @return 返回纷享系统的员工ID
     */
    @Override
    Integer callback(FunctionContext context, Map<String, List<String>> params) {
        log.info("callback_context: " + context)
        log.info("callback_params: " + params)
        //租户临时授权模式,如果有其他模式,请阅读第三方文档
        String token = getAccessToken(params);
        log.info("token: " + token);

        //从人员对象,获取纷享用户userId
        Integer userId = openId2userId(token);
        log.info("userId: " + userId);

        return userId;
    }


    /**
     * 登录成功后打开的页面,可以从params获取,或者指定一个页面,空则是打开默认的页面
     * @return 登录成功后打开的URL
     */
    String redirect(FunctionContext context, Map<String, List<String>> params) {
        return "";
    }

    /**
     * 在纷享系统登出时,自动跳转到第三方系统登出地址
     * @return 第三方登录地址,如无需登出第三方,请返回null
     */
    @Override
    String logoffUrl(FunctionContext context) {
        return logoffUrl;
    }

    /**
    *
    * URL回调
    *
    *
    */
    private static String appendUrl(String url, Map<String, String> data) {
        log.info("appendUrl_url: " + url)
        log.info("appendUrl_data: " + data)
        String paramStr = ''
        data.each {
        String key, value ->
          paramStr += key +"="+ value + "&"
        }
        paramStr = paramStr.substring(0, paramStr.length() - 1)

        String str=url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr);
        log.info("STR:"+str)
        return str
    }

    String getAccessToken(Map<String, List<String>> parameterMap) {
      log.info("getAccessToken_parameterMap: " + parameterMap)
        //以某第三方为示意,具体请查看第三方登录文档
        FormBody body = FormBody.builder()
                .field("client_id", CLIENTID)
                .field("grant_type", "authorization_code")
                .field("client_secret", CLIENTSECRET)
                .field("code", parameterMap["code"].get(0))
                .build()

        Request request = Request.builder()
                .method("POST")
                .url(PREFIX_URL + "/oauth2.0/accessToken")
                .timeout(7000)
                .retryCount(0)
                .body(body)
                .build()

        HttpResult o = (HttpResult) http.execute(request).getData()
        log.info(o)
        return o.content["access_token"].toString()
    }

    Integer openId2userId(String accessToken) {
        //获取第三方用户信息
        log.info("accessToken  " + accessToken)
        HttpResult o = (HttpResult) http.get(PREFIX_URL + "/oauth2.0/profile?access_token="+accessToken).getData();
        log.info("o === " + o)
        String user = o.content["id"].toString();
        log.info("user ===" + user)

        // 从第三方用户信息里,查询人员对象获取绑定信息,建议用自定义字段
        QueryResult data = (QueryResult) object.find("PersonnelObj",[[Mapping_Field: user]],2,0).getData()
        List<Map> dataList = data.dataList

        // 如果用户信息查找失败,返回错误
        // 也可以在此根据信息,进行新建人员并且设置绑定字段的内容
        if (dataList.size() <= 0) {
            log.info("找不到对应的用户, user:" + user)
            message.throwErrorMessage("CRM找不到您的账号,请联系管理员处理。")
        }

        if (dataList.size() > 1) {
            log.info("找不到对应的用户, user:" + user)
            message.throwErrorMessage("CRM找不到您的账号,请联系管理员处理。")
        }

        // 返回员工对象中的user_id字段,用于后续登录时使用
        return dataList[0]["user_id"].toString() as Integer
    }

    // debug 时候的入口方法
    void debug(FunctionContext context, Map arg) {
    }
}

2024-10-22
0 1