" transform="translate(10.232 59.216) scale(1.339)" font-size="18" fill="#fff" font-family="DFShiYiW5-GB"></>
本文档将介绍在 工蜂Git 中如何使用 oauth2 作为认证去登录到其他应用。
OAuth 是一个开放标准, 允许用户对客户端程序提供一个令牌,可以代表用户访问服务器资源。 在工蜂Git中有两种方法可以将新的 OAuth2 应用程序添加到实例。
开发者从工蜂侧边栏 导航到个人设置-->管理应用,点击右上角的 新增应用 创建属于自己的一个应用。
根据OAuth2的授权流程,开发者在创建应用过程必须向工蜂提供回调路径、名称等信息。同时,开发者可以根据自身业务的需求,来选择授权的范围以及操作。如下图所示:
工蜂分别提供了用户、项目组、项目等三个依次递减的范围以及API、Hooks、拉取项目的代码等授权操作。开发者可以在此基础之上进行勾选来确定获取用户在工蜂上的哪些数据和信息。
例如:开发者在创建应用的过程中,选择的授权范围是:当前帐号的所有权限以及项目权限, 并且选择的首选项是项目权限。选择的授权操作依次是:API、Hooks、拉取项目的代码。
那么工蜂在授权第三方应用的页面如下所示:
根据开发者在创建应用时选择的授权范围,在上图中,工蜂用户只能在当前帐号和 项目 之间进行选择。由于开发者选择的授权范围首选项是 项目,因此用户会优先在项目下的下拉框中,选择具体授权到哪一个项目。
同时,开发者在创建应用时选择的授权操作,也会在该页面中以列表的方式告知用户。
用户只能编辑自身创建的应用,可以导航到个人设置-管理应用,点击应用列表中最右侧的编辑按钮就可以进入编辑应用的页面。
用户只能删除自身创建的应用,可以导航到 个人设置-管理应用,点击应用列表中最右侧的删除按钮,然后在弹出来的确认框中点击确认就删除此应用。
用户想要查看自身创建的应用信息,可以导航到个人设置-管理应用,点击应用列表中应用名称就可以进入应用详情页面。
在应用详情页面的右上角,提供了编辑应用和删除应用的入口。考虑到操作的便捷性,在页面的应用ID 、秘钥以及回调地址展示区域,增加了一键复制的功能。
用户可以在工蜂中查看当前已授权应用的详情,以便进行管理。通过以下两种方式,可查看当前用户已授权的应用。
导航至个人设置-授权应用
点击工蜂右上角的图标(如下图所示)
进入当前用户已授权应用的列表页面,如下图所示:
授权应用列表的右侧是应用的具体信息,点击 授权应用 或者列表中应用的名称,进入到授权应用的详情页面,如下图所示:
每一个工蜂用户可以对同一个应用进行多次授权,用户在授权应用的详情页面中可以看到在当前应用中授权列表。同时,在授权详情列表中,用户可随时取消某次授权。
如果用户想要取消在应用下的所有授权,可以返回至授权应用列表中,点击右侧应用详情的卸载应用按钮,将该应用进行卸载。
工蜂Git的应用分为两种,一种是用户应用,另外一种是系统应用。用户应用在经过工蜂Git管理员认证之后,就会成为系统应用,上架到我们的应用市场。
用户在应用市场中,可以对自己感兴趣的应用进行授权认证。通过以下两种方式,进入到工蜂Git的应用市场。
点击工蜂右上角的图标,然后点击应用探索(如下图所示)
导航至 开源-应用市场
进入到应用市场之后,点击应用列表右侧的 立即授权 按钮,即可对相应的应用进行授权认证。
用户可以点击上图中的 立即授权 按钮,直接对第三方应用进行授权。在工蜂Git中可以对同意授权 对应的链接进行自定义,第三方应用的管理者在创建应用的时候或者重新编辑应用,添加 授权路径 。
在添加 授权路径 之后,用户点击同意授权 之后会跳转到相应的路径中。如果为第三方应用的管理者未添加授权路径,那么用户点击同意授权之后会跳转到:http://git.code.tencent.com/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code
如果授权的应用在创建时设置了所有的授权的范围类型,oauth的授权认证页面将支持三种授权类型,用户可根据实际的情况选择类型授权,如下:
三种类型授权范围对应生成token的权限访问。
Web应用程序流是最安全和最常见的流类型, 为具有安全服务器端的应用程序而设计。
Web应用程序流要求应用程序在用户的个人设置-应用程序页面注册,在注册期间,您可以限制应用程序可访问的资源范围, 创建后,您将获得这个应用程序的 ID 和 客户端密码。
注意:OAuth 规范建议将状态参数与每个请求一起发送到 /oAuth/authorize
。而且我们也强烈建议在每个请求中发送唯一值,
然后根据重定向请求中的值进行验证。这对于防止 CSRF 攻击非常重要。您可以通过下面的部分找到关于如何获得每个流的授权详细说明
请求授权代码
如果您要请求授权代码, 您应该将用户重定向到 /oauth/authorize
,然后使用 get 参数:
http://git.code.tencent.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code&state=YOUR_UNIQUE_STATE_HASH
这将要求用户允许应用程序访问他的账户,然后重定向回到用户提供的 REDIRECT_URI 。 重定向包括 GET 代码参数, 列如:
http://git.code.tencent.com/oauth/redirect?code=1234567890&state=YOUR_UNIQUE_STATE_HASH
请求访问令牌
获取授权代码之后,您就可以使用这个代码请求访问令牌,这样您就可以使用任何HTTP客户端。在下面的列子中,我们使用的是Ruby的rest-client:
parameters = 'client_id=APP_ID&client_secret=APP_SECRET&code=RETURNED_CODE&grant_type=authorization_code&redirect_uri=REDIRECT_URI'
RestClient.post 'http://git.code.tencent.com/oauth/token', parameters
# The response will be
{
"access_token": "de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54",
"token_type": "bearer",
"expires_in": 7200,
"refresh_token": "8257e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1"
}
注意:重定向 uri 必须与原始授权请求中使用的重定向 uri 相匹配。
现在,您就可以用访问令牌对API进行请求了。
刷新访问令牌
获取访问令牌之后,您可以请求使用 refresh_token 去刷新访问令牌,这样您就可以使用任何HTTP客户端了。 在下面的列子中,我们使用的是Ruby的rest-client:
parameters = 'client_id=APP_ID&client_secret=APP_SECRET&grant_type=refresh_token&refresh_token=RETURNED_REFRESH_TOKEN&redirect_uri=REDIRECT_URI'
RestClient.post 'http://git.code.tencent.com/oauth/token', parameters
# The response will be
{
"access_token": "820ba8aed28aa506c71eedbde64f9dd350e54780bc506a0446309bd9362e1c5c",
"token_type": "bearer",
"expires_in": 7200,
"refresh_token": "6cf95716009897668c33a1918f3bff8257e65c97202ed172b2544b26e00a61df"
}
注意:如果您直接使用 refresh_token 生成新的令牌时,这个令牌是无效的。对与无效的命令,您可以 efresh_token 获取一个新的令牌。
方式一
使用URL 请求参数access_token
,将令牌作为GET参数传递。
GET http://git.code.tencent.com/api/v3/user?access_token=OAUTH-TOKEN
方式二
使用 HTTP_HEADER 的 OAUTH-TOKEN
,例如:
curl --header "OAUTH-TOKEN: 820ba8aed28aa506c71eedbde64f9dd350e54780bc506a0446309bd9362e1c5c" http://git.code.tencent.com/api/v3/user
您可以使用 oauth 令牌发出请求去克隆您有权限的存储库. 以 Git 的命令为例:
git clone http://oauth2:OAUTH-TOKEN@git.code.tencent.com/test/test.git
注意:oauth 令牌必须是效。当它无效时,可以刷新获取一个新的令牌。
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。在下面的列子中,我们使用的是Ruby的rest-client:
parameters = 'client_id=APP_ID&client_secret=APP_SECRET&grant_type=client_credentials'
RestClient.post 'http://git.code.tencent.com/oauth/token', parameters
# The response will be
{
"access_token": "de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54",
"token_type": "bearer",
"expires_in": 7200,
"refresh_token": "8257e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1"
}
注意:严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
新建的应用只能创建者本人查看, 通过认证后可以在应用探索和开源-应用市场中展示,认证应用可以通过邮件联系我们: gitmaster@tencent.com