GitLab作为OAuth2提供商

的使用方法OAuth2协议允许其他服务代表用户访问Gitlab资源。

如果您希望GitLab成为OAuth认证服务提供商以登录其他服务,请参阅OAuth2提供者文档。

这个功能是基于看门的人宝石

支持的OAuth2流

Gitlab目前支持以下授权流程:

  • Web应用流程-最安全和最常见的流类型,专为具有安全服务器端的应用程序设计。
  • 隐式流-这个流程是专为用户代理的应用程序(例如单页web应用程序运行在GitLab页面)。
  • 资源所有者密码凭证流-待用只有用于安全托管的第一方服务。

请参考OAuth RFC以详细了解所有这些流是如何工作的,并为您的用例选择正确的流。

这两个web应用程序隐式的流需要应用程序首先通过/ profile /应用程序页面在您的用户帐户。在注册期间,通过启用适当的作用域,您可以限制资源的范围应用程序可以访问。一经创造,你将获得应用程序凭证:应用程序ID客户的秘密-保证他们的安全

重要的是:OAuth规范建议发送状态参数指定每个请求的值oauth /授权.我们强烈建议为每个请求发送一个唯一的值,并根据重定向请求中的值对其进行验证。预防这一点很重要CSRF攻击.的状态Param真的应该是标准中的一个要求!

在下面的部分中,您将找到有关如何从每个流获得授权的详细说明。

Web应用流程

检查RFC规范获取详细的流程描述

1.请求授权码

要请求授权码,您应该将用户重定向到oauth /授权端点具有以下GET参数:

https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code&state=YOUR_UNIQUE_STATE_HASH

这将要求用户批准应用程序对其帐户的访问权限,然后重定向到REDIRECT_URI你提供的。重定向将包括GET代码参数,例如:

http://myapp.com/oauth/redirect?code=1234567890&state=YOUR_UNIQUE_STATE_HASH

然后你应该使用代码请求访问令牌。

2.请求访问令牌

一旦你有了授权码,你就可以申请一个access_token使用代码,您可以使用任何HTTP客户端来做到这一点。在下面的示例中,我们使用Ruby的rest客户端

parameters = 'client_id=APP_ID&client_secret=APP_SECRET&code= returned d_code &grant_type=authorization_code&redirect_uri=REDIRECT_URI'RestClient。Post 'http://gitlab.example.com/oauth/token',参数#回应将是{:“access_token de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54”,“token_type”:“持票人”,“expires_in”:7200年,“refresh_token”:“8257 e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1”}

注意:redirect_uri必须匹配redirect_uri在原始授权请求中使用。

现在,您可以使用返回的访问令牌向API发出请求。

隐式授予

检查RFC规范获取详细的流程描述。

与web流不同,客户端接收一个访问令牌立即作为授权请求的结果。流不使用客户端秘密代码或授权代码,因为所有应用程序代码和存储都很容易访问秘密容易漏水。

重要的是:避免在Gitlab实例之外存储数据的应用程序使用此流。如果有,一定要核实应用程序id在授予对数据的访问权限之前与访问令牌相关联(参见/ oauth /令牌/信息)。

1.请求访问令牌

要请求访问令牌,您应该将用户重定向到oauth /授权端点使用令牌反应类型:

https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token&state=YOUR_UNIQUE_STATE_HASH

这将要求用户批准应用程序对其帐户的访问权限,然后重定向到REDIRECT_URI你提供的。重定向将包含一个带有access_token以及GET参数中的令牌细节,例如:

http://myapp.com/oauth/redirect#access_token=ABCDExyz123&state=YOUR_UNIQUE_STATE_HASH&token_type=bearer&expires_in=3600

资源所有者密码凭据

检查RFC规范获取详细的流程描述。

弃用注意:从GitLab 8.11开始,资源所有者密码凭证已经禁用对于已开启双因素身份验证的用户。这些用户可以使用个人访问令牌代替。

在此流程中,请求令牌以换取资源所有者凭证(用户名和密码)。只有当资源所有者和客户端之间存在高度信任时(例如,客户端是设备操作系统的一部分或具有高度特权的应用程序),以及当其他授权授予类型不可用时(例如授权代码),才应该使用凭据。

重要的是:在99%的情况下,不要存储用户凭据,只在客户端部署到可信环境时才使用此授权类型个人访问令牌是更好的选择。

尽管这种授权类型要求客户端直接访问资源所有者凭据,但资源所有者凭据用于单个请求,并被交换为访问令牌。此授权类型可以通过与长期访问令牌或刷新令牌交换凭据,从而消除客户端存储资源所有者凭据以供将来使用的需要。

1.请求访问令牌

POST请求oauth /令牌与参数:

{grant_type: password;username: user@example.com;"password": "secret"}

然后,您将在响应中收到访问令牌:

{“access_token”:“1 f0af717251950dbd4d73154fdf0a474a5c5119adad999683f5b450c460726aa”,“token_type”:“持票人”,“expires_in”:7200}

对于测试,你可以使用oauth2 ruby gem:

client = OAuth2:: client。New ('the_client_id', 'the_client_secret',:site => "http://example.com")Access_token = client.password.get_token('user@example.com', 'secret')把access_token.token

访问Gitlab API访问令牌

访问令牌允许您代表用户向API发出请求。您可以将令牌作为GET参数传递

得到https://gitlab.example.com/api/v4/user?access_token=OAUTH-TOKEN

或者你可以把令牌放到授权头中:

curl -header "Authorization: Bearer OAUTH-TOKEN" https://gitlab.example.com/api/v4/user
Baidu
map