文档在此:https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-oauth-authentication/
Auth1认证流程
下面来详细说明sso中的Auth1完整流程:
以微信小程序为例子:
微信小程序服务器会提供一个接口,当然这个接口是只提供给开发者,开发者用client_id+redirect_url去微信端换取code,这个code再经过鉴权,如果合法就会把用户的user_id和不敏感信息返回给app,这个返回过程是直接透传到回调地址中(这个地址开发者会配置),那么此时我们就拿到了用户的信息。
假设张三点击了授权,那么服务器在redirect_url中会这样处理:直接去atlassian-jira-auth(auth1授权)的授权页面去请求授权,此时我 需要带上四个参数:baseUrl(你的jira服务的url),privateKey和consumerKey和callBackUrl(成功后的回调地址)。
对于privateKey和consumerKey是你自己部署的jira服务器生成的,需要jira管理员在服务端安装auth1服务的插件,此时就会生成privateKey和consumerKey做为你服务器的唯一标识。
这个过程的文档在这里:
https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-oauth-authentication/#step-1-configure-your-client-application-as-an-oauth-consumer
接着上面的说,此时atlassian-jira-auth服务器(并非你自己公司的),会校验的privateKey等参数,然后返回给你一个requestToken,这个token是用来记录此时操作的是某一个用户,请注意,此时授权尚未成功,但是atlassian-jira-auth服务器会返回你这些有用的信息:requestToken,requestTokenUrl,因为之前我们已经拿到了用户的user_id,那么我将这几个字段存在user_config这张表里,而requestToken是作为唯一主键,请注意,此时用户并未授权完成。
这部分的关键代码如下:
接着上面说,此时服务器会在之前填写的回调地址等待用户授权成功,页面如下
当然,这个页面是需要用户输入用户密码,然后点击授权按钮的。
我们假如用户进行了这一系列操作,atlassian-jira-auth服务器会向你之前配置的回调地址发送一些数据,这些数据如下:
其中OauthToken就是我们第一次授权服务器端返回的requestToken,请记住,这个数据我们和user_id(微信小程序)一起存库了,它是唯一的,它的作用就是在这里标记关联的用户是谁。
那么此时进入最后一步了,
我们再次用requestToken,verifiercode(此次授权返回的数据)+consumerKey+privateKey去atlassian-jira-auth换取AccessToken,oauthSecret(这两个组合加起来相当于密码了),然后把这些数据统一存在数据库里。
此时我们就做到了user_id <-----> requestToken <----> jira_user的唯一关联了。
之后的所有请求都走这个过滤器,我们用自己部署的jira_base_url + 上面这一组参数去计算签名,
然后把这个签名放在请求的Header里面,去自己的jira服务器里请求数据,服务器端会验证这个签名(相当于账户密码),这样你的每次restApi请求就能带上jira用户态和微信用户态了,以上就是标准的oath1流程。
Auth2认证流程
auth2认证和auth1的区别就是三方验证与两方验证的区别,只要jira服务器提供了这种验证方式,其实本质上区别是不大的。
主要文档在此:https://developer.atlassian.com/cloud/jira/platform/oauth-2-authorization-code-grants-3lo-for-apps/
这个相对与oath1来说安全性要高很多,因为不会有第三方来保存用户的授权信息了(oath1只要授权,就可以一直用数据库里的信息操作jira账号),此时就需要第三方服务器每次来验证请求方是否是合法请求,这里要提出JWT这一概念。
1.Jira服务器管理员需要首先在jira服务器配置自己信任的app url,这个url对外提供http服务,说白了就是向这个服务注册用户的某些信息。
说白了,也就是这些controller再做事情:
下面让我们看下这个库里的字段:
CREATE TABLE atlassian_host
(client_key
varchar(127) NOT NULL,public_key
varchar(255) DEFAULT NULL,shared_secret
varchar(255) NOT NULL,base_url
varchar(255) NOT NULL,product_type
varchar(255) DEFAULT NULL,description
varchar(255) DEFAULT NULL,service_entitlement_number
varchar(255) DEFAULT NULL,addon_installed
bit(1) DEFAULT NULL,created_date
datetime DEFAULT NULL,last_modified_date
datetime DEFAULT NULL,created_by
varchar(255) DEFAULT NULL,last_modified_by
varchar(255) DEFAULT NULL,
PRIMARY KEY (client_key
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
好,如果这一步执行成功,那么你这个jira服务器就相当于信赖这个app了,此时我们所有api请求都往这个app里打。
然后每次请求都带上自己服务器的baseUrl和此时请求的userKey,我们假设也是用微信小程序和Jira关联,此时我们知道自己的baseUrl,并且请求的userKey我也有。那么在经过上一步骤之后,我们通过baseUrl能够获取唯一AtlassianHostUser,此时,我们的Auth2认证才开始。
所有api请求在app中会被过滤器请求执行
每一次请求,app都会结合第一步绑定的用户信息生成JWT令牌,app用这个令牌去Authorization Server换取 Oauth bearer token凭证,接着app就可以拿着这个凭证去你绑定的jira服务器里请求数据了,只要这个凭证是正确的,你就有操作这个jira服务器的权限(权限在json文件里写了)
所有的操作示例代码在以下会给出。