实践一下 GitLab 的 OAuth2 验证方式

5,957 阅读2分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

需求:实现一个基于 gitlab 为身份提供,通过 GitLab授权后免密登录到我的页面里

Oauth2.0 token

OAuth2即 OAuth 2.0版本,是一个关于授权的开放网络标准,也是目前应用最广泛的授权认证方式。运行流程如下:

oauth2.png

Gitlab Identify Provider

GitLab提供了允许第三方服务使用OAuth2协议代表用户访问GitLab资源的API。GitLab 支持以下授权方式:

  • PKCE密码模式(Proof Key for Code Exchange):最安全。没有PKCE,你必须在移动端上使用客户端的密钥,且它被推荐使用在客户端和服务器应用程序。
  • 授权码模式 authorization code:安全、共同流动。在安全的服务器端应用上推荐使用。
  • 隐式模式 implicit Grant:最初设计仅供用户代理程序,如单页GitLab页面上运行的web应用程序。IETF不建议使用隐式授权流。
  • 资源所有者密码凭证:仅用于安全托管,自身的服务。GitLab推荐不要使用此流程。

实践

使用 GitLab 的 OAuth2 验证方式实践一下

第一步,在 GitLab 创建一个应用,然后选择你需要的 Scopes

gitlab-addapp.png

然后在创建后的应用我们可以得到应用 ID 和密钥。

gitlab-config1.png

完成这一切之后,我们可以给前端配置一个请求授权码 code 的链接,然后点击链接进入 GitLab 的授权页面,点击确认授权后,我们可以获取到 code 值。

- GET
https://gitlab.com/oauth/authorize?response_type=code&state=STATE&scope=read_user&client_id={ClientId}&redirect_uri={redirect_uri}

如果你使用了本地化的 GitLab那么你访问的域名应该是你的gitLab的域名,如是https://gitlab.xxxx.com。获取到授权码 code 后可以通过 code 值获取accessToken值,

- POST
https://gitlab.com/oauth/token?client_id={clientId}&client_secret={clientSecret}&code=4174a56cca32bc909ec416015e11f8980f6102a21e5fe7a2dcca76935b3701be&grant_type=authorization_code&redirect_uri={redirect_uri}

请求得到返回值如下:

{
    "access_token": "a66d6cfff43160957a64fe52cd8c8f760261516ba6e89a6b8015d9316c14c3b0",
    "token_type": "Bearer",
    "expires_in": 7200,
    "refresh_token": "c3e15bd879323aa86b163f71a0d1d61758fb9cfbb359606110b6d5cea0133f6f",
    "scope": "read_user",
    "created_at": 1644581174
}

获取到 access_token 后就可以调用你想要的接口,比如获取到用户信息,拿到用户的身份标识就可以和自己本地用户的身份标识进行对比,如果以存在则直接登录到自己的程序内,如果未存在则存储再登录到自己的程序内。

整个Oauth2.0流程就是这样简单。