# 第三方登录

1.3.0开始支持第三方登录,并提供多种登录方式。

# LDAP登录

application.properties中添加配置:

# ldap服务器地址,如:ldap://172.16.6.64:389
torna.ldap.url=ldap://172.16.6.64:389
# ldap域名信息,如:dc=your_domain,dc=com
torna.ldap.base=dc=your_domain,dc=com
# 管理员账号,如:cn=Manager,dc=your_domain,dc=com
torna.ldap.username=cn=Manager,dc=your_domain,dc=com
# 管理员密码
torna.ldap.password=xxx

默认根据uid查询登录,如果要根据sAMAccountName登录,修改filter:

# 默认:(&(objectClass=*)(uid=%s))
torna.ldap.filter=(&(objectClass=*)(sAMAccountName=%s))

用户登录后会读取LDAP三种属性:

  • uid:登录账号
  • displayName:显示名称,这个会当做昵称,如果没有则uid当昵称

默认情况下LDAP用户登录没有设置邮箱,如果要设置邮箱,可以指定配置,设置邮箱域名:

torna.email-domain=xxx.com

然后用户邮箱会以<uid>@xxx.com的方式呈现

重启服务

# 模拟表单登录

第三方服务提供一个登陆API,然后Torna服务调用这个登录API登录,登录成功后保存用户信息。

实现类:cn.torna.service.login.form.impl.DefaultThirdPartyLoginManager

开启步骤如下:

假设第三方登录接口如下:

  • POST http://a.abc.com/api/login
  • Content-Type:application/json
  • 请求示例:
{
    "username": "xx",
    "password": "xx"
}
  • 返回示例:
{
  "nickname": "Jim",
  "email": "jim@abc.com"
}

application.properties中添加配置:

# 开启第三方登录配置
torna.login.third-party.enable=true
# 登录类型,form,oauth 二选一,form:模拟表单登录,oauth:OAuth认证登录
torna.login.third-party.type=form
# 第三方登录url
torna.login.third-party.form.url=http://a.abc.com/api/login
# 登录账号参数名称
torna.login.third-party.form.key.param-username=username
# 登录密码参数名称
torna.login.third-party.form.key.param-password=password
# 返回结果昵称字段名称
torna.login.third-party.form.key.result-nickname=nickname
# 返回结果邮箱字段名称
torna.login.third-party.form.key.result-email=email
# 登录请求method
torna.login.third-party.form.method=POST
# 登录请求content-type
torna.login.third-party.form.content-type=application/json

返回结果中的昵称和邮箱选填,如果有建议返回,保证数据完整性。

配置完毕后,重启服务器,在登录页填写用户名密码。

如果返回结果带有状态码,如下面这个格式:

{
    "status": 1000,
    "nickname": "Jim",
    "email": "jim@abc.com"
}

可在配置文件中添加如下配置:

# 返回code字段名称
torna.login.third-party.form.key.result-code=status
# 返回成功时,code值
torna.login.third-party.form.value.result-code=1000

如果返回结果带有状态码,消息,数据节点,如下面这个格式:

{
   "code": "0",
   "msg": "",
   "data": {
      "nickname": "Jim",
      "email": "jim@abc.com"
   }
}

可在配置文件中添加如下配置:

# 返回code字段名称
torna.login.third-party.form.key.result-code=code
# 返回成功时,code值
torna.login.third-party.form.value.result-code=0
# 返回msg字段名称
torna.login.third-party.form.key.result-msg=msg
# 返回数据节点字段名称,没有指定则为根节点
torna.login.third-party.form.key.result-data=data

# GitLab账号登录(OAuth认证)

OAuth的认证流程如下(详见:OAuth认证 (opens new window)):

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

这里以GitLab作为认证服务器讲解如何配置参数

  • 前往GitLab设置页面,点击Applications,配置认证。

GitLab

  • Name:名称,随便取
  • Redirect URI:回调地址,固定格式:http://ip:port/system/oauth/custom/callbackipport填Torna服务器对应IP端口
  • Scopes:勾选图中两项

点击保存,出现配置信息,如下图所示:

GitLab

然后在application.properties中添加配置:

# 开启第三方登录配置
torna.login.third-party.enable=true
# 登录类型,form,oauth 二选一,form:模拟表单登录,oauth:OAuth认证登录
torna.login.third-party.type=oauth
# 登录按钮文字,GitLab登录,如果value有中文需要转换成Unicode
torna.login.third-party.oauth.login-button-text=GitLab\u767b\u5f55
# 对应Application Id
torna.login.third-party.oauth.client-id=b29160dcb9f33334a599f180c34f3207c263dc5d9ee921dbe969e59836b61232
# 对应Secret
torna.login.third-party.oauth.client-secret=bc240d981fd5d3a04bde15c266af3373abf2664a948449b0d482a88267a4d51b
# 对应Callback url
torna.login.third-party.oauth.redirect-uri=http://10.1.30.165:7700/system/oauth/custom/callback
# 对应Scopes,用+相连
torna.login.third-party.oauth.scope=read_user+openid

# 下面是GitLab配置
# 授权的url,IP端口对应GitLab服务器
torna.login.third-party.oauth.url.authorize=http://10.211.55.5:7777/oauth/authorize
# 获取accessToken的url,IP端口对应GitLab服务器
torna.login.third-party.oauth.url.access-token=http://10.211.55.5:7777/oauth/token
# 获取用户信息的url,IP端口对应GitLab服务器
torna.login.third-party.oauth.url.user-info=http://10.211.55.5:7777/api/v4/user

配置完毕后,重启服务,访问登录页,点击下方的第三方登录,或者直接在浏览器输入:http://ip:port/system/oauth/login/custom IP端口对应Torna服务器

页面会跳转到GitLab登录页,输入GitLab账号,登录后会询问是否授权,点击授权,成功后跳转到Torna首页。

GitLab

  • 相关源码

见:cn.torna.service.login.oauth包

controller:cn.torna.web.controller.system.OauthController

Torna的OAuth认证基于 JustAuth (opens new window)

# 钉钉免密登录

使用场景:在钉钉工作台配置一个图标,点击图标立即跳转到Torna首页,免登录就能使用。

前提:公网能够访问你的Torna应用。

登录钉钉开发者后台 (opens new window)

进入应用开发 - 企业内部开发,点击创建应用,创建一个创建企业内部应用,填写表单

钉钉图标:

创建成功后生成对应AppKeyAppSecret

点击开发管理,填写配置

  • 服务器出口IP

填Torna服务出口IP

  • 应用首页地址/PC端首页地址

两者一样,填http://{domain}/system/dingtalk/logindomain为你的公网域名,如:http://torna.xxx.com/system/dingtalk/loginhttp://torna.bbb.com:7700/system/dingtalk/login

  • 管理后台地址

不用填

保存

点击权限管理,开通相关接口权限。

需要开通的有:手机号码信息,邮箱等个人信息,成员信息读权限,调用OpenApp专有API时需要具备的权限

点击钉钉登录与分享,填写回调域名

填:http://{domain}/system/dingtalk/callbackdomain为你的公网域名

点击版本管理与发布,发布应用。

  • 配置application.properties

新增如下配置:

# 公网地址,到端口号,末尾没有/,如:http://torna.xxx.com,http://torna.xxx.com:7700
torna.base-url=http://torna.xxx.com
# 应用的AppKey
torna.dingtalk.app-key=应用的AppKey
# 应用的AppSecret
torna.dingtalk.app-secret=应用的AppSecret

重启服务器,到钉钉OA工作台,点击Torna图标进行登录

如果登录失败,打开服务端日志log/server.log查看报错信息,如果是IP白名单问题,将报错中的IP添加的出口IP中。