内部系统或者外采系统集成到中台,前端应用接入中台单点登录流程

中台登录

前端应用场景

单点登录JSSDK文档 - 图1

登录集成

  • 钉钉APP内打开,使用钉钉免密登录
  • PC端web系统,使用中台单点登录

    统一登录 JSSDK

    npm包名

  • gj-sso-sdk@2.1.5

    适配项目

  • jssdk使用typescript编写,且与前端框架解耦,支持js或ts项目的编写环境,也支持各种语言框架(React/Vue/Angular/JQuery)的集成

    问题反馈

  • 钉钉联系 李洋

    接入流程

    1. PC端web系统

    安装依赖

    1. yarn add gj-sso-sdk -D
    2. // or
    3. npm i gj-sso-sdk -D

原始模板html文件head标签中中引入钉钉jsapi文件

  1. <script src="http://static.gaojin.com.cn/libs/dingtalk-jsapi/2.10.3/index.js"></script>

入口调用

Vue项目**

  1. // 写在App.vue中
  2. <script>
  3. import SsoSDK from 'gj-sso-sdk'
  4. export default {
  5. async mounted(){
  6. await SsoSDK.config({
  7. env: 'dev' // 环境变量值
  8. })
  9. }
  10. }
  11. </script>
  1. // 或直接写在main.js文件
  2. import SsoSDK from 'gj-sso-sdk'
  3. // 通过包装一个async函数,来保证调用sdk时序
  4. async function main(){
  5. await SsoSDK.config({
  6. env: 'env' // 环境变量值
  7. })
  8. // 挂载全局,方便调用
  9. window.SsoSDK = SsoSDK
  10. let app = new Vue({
  11. router,
  12. store,
  13. render: h => h(App)
  14. }).$mount("#app");
  15. }
  16. main()

React项目

  1. // 写在root component中
  2. import React from 'react'
  3. import SsoSDK from 'gj-sso-sdk'
  4. export default class Root extends React.Component {
  5. async componentDidMount(){
  6. await SsoSDK.config({
  7. env: 'dev' // 传入环境变量
  8. })
  9. }
  10. }
  11. ReactDOM.render(<Root />, document.getElementById("root"))

Umi项目

  1. // app.tsx
  2. import SsoSDK from 'gj-sso-sdk';
  3. import { getQueryString } from '@/utils/utils';
  4. export async function render(defaultRender) {
  5. console.log('BUILD_ENV => ', BUILD_ENV)
  6. await SsoSDK.config({
  7. env: BUILD_ENV,
  8. });
  9. window.SsoSDK = SsoSDK;
  10. await defaultRender();
  11. }

拦截器

前端使用axios拦截器来进行登录鉴权,鉴权逻辑由开发者实现。
以下是如何token携带,以及鉴权未通过后手动调用中台登录的实现demo:

  1. // 请求拦截器
  2. axios.interceptors.request.use(
  3. config => {
  4. config.headers["Access-Token"] = SsoSDK.getToken()
  5. }
  6. )
  7. // 响应拦截器
  8. axios.interceptors.response.use(
  9. res => {
  10. // execute your success callback
  11. },
  12. error => {
  13. // 鉴权失败时调用单点登录逻辑
  14. if(error.response.status === 401) {
  15. SsoSDK.configSSO({
  16. env: 'dev'
  17. })
  18. }
  19. }
  20. )

任何时候需要手动调用中台登录时(无论是否登录),使用SsoSDK.configSSO这个api


2. 钉钉H5微应用

安装依赖

  1. yarn add gj-sso-sdk -D
  2. // or
  3. npm i gj-sso-sdk -D

原始模板html文件head标签中中引入钉钉jsapi文件

  1. <script src="http://static.gaojin.com.cn/libs/dingtalk-jsapi/2.10.3/index.js"></script>

入口文件引入

Vue项目

  1. // 写在App.vue中
  2. <script>
  3. import SsoSDK from 'gj-sso-sdk'
  4. export default {
  5. async mounted(){
  6. await SsoSDK.config({
  7. env: 'dev', // 环境变量值
  8. jsApiList: [ // 需要授权的api list
  9. 'biz.contact.complexPicker',
  10. 'biz.util.chooseImage',
  11. ]
  12. })
  13. }
  14. }
  15. </script>
  1. // 或直接写在main.js文件
  2. import SsoSDK from 'gj-sso-sdk'
  3. // 通过包装一个async函数,来保证调用sdk时序
  4. async function main(){
  5. await SsoSDK.config({
  6. env: 'env', // 环境变量值
  7. jsApiList: [ // 需要授权的api list
  8. 'biz.contact.complexPicker',
  9. 'biz.util.chooseImage',
  10. ]
  11. })
  12. // 挂载全局,方便调用
  13. window.SsoSDK = SsoSDK
  14. let app = new Vue({
  15. router,
  16. store,
  17. render: h => h(App)
  18. }).$mount("#app");
  19. }
  20. main()

React项目

  1. // 写在root component中
  2. import React from 'react'
  3. import SsoSDK from 'gj-sso-sdk'
  4. export default class Root extends React.Component {
  5. async componentDidMount(){
  6. await SsoSDK.config({
  7. env: 'dev', // 传入环境变量
  8. jsApiList: [ // 需要授权的api list
  9. 'biz.contact.complexPicker',
  10. 'biz.util.chooseImage',
  11. ]
  12. })
  13. }
  14. }
  15. ReactDOM.render(<Root />, document.getElementById("root"))

Umi项目

  1. // app.tsx
  2. import SsoSDK from 'gj-sso-sdk';
  3. import { getQueryString } from '@/utils/utils';
  4. export async function render(defaultRender) {
  5. console.log('BUILD_ENV => ', BUILD_ENV)
  6. await SsoSDK.config({
  7. env: BUILD_ENV,
  8. jsApiList: [ // 需要授权的api list
  9. 'biz.contact.complexPicker',
  10. 'biz.util.chooseImage',
  11. ]
  12. });
  13. window.SsoSDK = SsoSDK;
  14. await defaultRender();
  15. }

拦截器

前端使用axios拦截器来进行登录鉴权,鉴权逻辑由开发者实现。
以下是如何token携带,以及鉴权未通过后手动调用中台登录的实现demo:

  1. // 请求拦截器
  2. axios.interceptors.request.use(
  3. config => {
  4. config.headers["Access-Token"] = SsoSDK.getToken()
  5. }
  6. )
  7. // 响应拦截器
  8. axios.interceptors.response.use(
  9. res => {
  10. // execute your success callback
  11. },
  12. error => {
  13. // 鉴权失败时调用单点登录逻辑
  14. if(error.response.status === 401) {
  15. SsoSDK.configSSO({
  16. env: 'dev'
  17. })
  18. }
  19. }
  20. )

任何时候需要手动调用钉钉免密登录授权,使用SSOLogin.config这个api

3. API 文档-属性

SsoSDK.configuation

config配置项对象

  1. SsoSDK.configuation
  2. // 返回
  3. {
  4. env: 'dev,
  5. jsApiList: ['dd.biz.contact']
  6. }

单点登录JSSDK文档 - 图2

SsoSDK.accessTokenCookieKey

中台登录后存储在cookie中的token-key

[ENV].sso.login.account.operation.auth

  1. SsoSDK.accessTokenCookieKey
  2. //返回
  3. "dev.sso.login.account.operation.auth" // dev环境
  4. "test.sso.login.account.operation.auth" // test环境
  5. "uat.sso.login.account.operation.auth" // uat环境
  6. "sso.login.account.operation.auth" // 生产环境

SsoSDK.runtimeDeviceEnv

当前环境

  1. SsoSDK.runtimeDeviceEnv
  2. // 返回
  3. "dev"

4. API文档-方法

SsoSDK.config

初始化配置,开发者需注意,config方法会自动识别当前运行端环境是钉钉应用还是非钉钉应用,但jsApiList在钉钉应用中为必传参数。当未登录时,钉钉应用会自动调用登录,非钉钉应用会跳转中台单点登录。

参数列表

字段 类型 说明 是否必须
env string 环境变量,可选值为local | dev | test | uat | prod
domain string cookie域名写入,一般不需要,供本地调试使用
jsApiList Array 钉钉鉴权api列表,调用钉钉免密登时必传
withSession boolean 是否开启session级别登录保持,默认为false
url string 鉴权url
  1. export interface SSOLoginConfig {
  2. // 调用环境
  3. env: EnvType
  4. // cookie域名写入,勿传,仅供调试用
  5. domain?: string;
  6. // jsApiList 调用钉钉免密时必传
  7. jsApiList?: Array<string>
  8. // 是否开启session级别登录保护
  9. withSession?: boolean
  10. // 鉴权url
  11. url?: string
  12. }

SsoSDK.configSSO

强制调用中台单点登录,只能在非钉钉应用内调用。

参数列表,同config

  1. SsoSDK.configSSO({
  2. env: 'dev'
  3. })

SsoSDK.hasToken

查询cookie中是否已存在token

  1. SsoSDK.hasToken()
  2. // 返回
  3. true

SsoSDK.getToken

获取token

  1. SsoSDK.getToken()
  2. // 返回
  3. "ejljdfjl1nldfjljldjldg8309hfh7gho5s6hl23p"

SsoSDK.setDDConfig

手动调用钉钉鉴权

  1. await SsoSDK.setDDConfig();