我们知道,google auth2的用户授权登录分两种
Google OAuth2提供了两种授权模式:
授权码模式(Authorization Code Grant)和隐式授权模式(Implicit Grant)。
-
授权码模式:
授权码模式通过用户授权码的方式获取Access Token,在安全性上比隐式授权模式更可靠。该模式主要的流程是先重定向到Google OAuth2的授权服务器,用户登录并授权,授权服务器将授权码返回给Web应用,Web应用使用授权码向Google OAuth2服务器交换Access Token。 -
隐式授权模式:
隐式授权模式中直接通过redirect_uri返回Access Token,减少了授权过程的复杂度和流程,但相应的安全性较授权码模式差。该模式主要的流程是先重定向到Google OAuth2的授权服务器,用户登录并授权,授权服务器将Access Token直接返回给Web应用。
需要注意的是,隐式授权模式只适合用于在浏览器端的JavaScript等非服务端语言进行开发,因为此时应用无法安全保管客户端的令牌。而授权码模式适用于所有的应用类型和开发环境,适用范围更广。
Google OAuth2 认证流程会返回三个重要的令牌
- Access Token:访问令牌,用于访问受保护的 API。
- Refresh Token:刷新令牌,用于在 Access Token 失效后申请新的 Access Token。
- ID Token:身份令牌,用于验证用户身份。
在进行 OAuth2 认证流程时,要确保在授权时向 Google 请求持久化 Refresh Token,并确保将 Refresh Token 存储在可靠的位置中
。当 Access Token 失效时,应该使用 Refresh Token 来向 Google 申请新的 Access Token。
为了确保每次都能拿到刷新令牌,开发者需要保证以下几点:
- 在每次需要访问 API 时,先检查 Access Token 的有效性,如果已失效,则使用 Refresh Token 向 Google 申请新的 Access Token。
- 如果每次申请 Access Token 都会使用同一个 Refresh Token,那么开发者需要注意 Refresh Token 的失效时间问题,确保 Refresh Token 在有效期内。
- 同时,如果有必要,开发者还可以定期提示用户重新授权,以获得新的 Refresh Token。
在授权时请求持久化 Refresh Token
在进行 Google OAuth2 认证时,需要向 Google 发起授权请求,并带上一些参数,例如 response_type
、client_id
、redirect_uri
、scope
等。其中 scope
参数表示所要访问的 Google API 权限范围
。如果要在授权时请求持久化 Refresh Token
,需要在授权请求中添加 access_type=offline
和 prompt=consent
这两个参数。
access_type=offline
表示请求持久化的 Refresh Token
,而 prompt=consent
表示要求用户授权时强制用户再次确认
,以便获取 Refresh Token。
https://accounts.google.com/o/oauth2/auth?
response_type=code&
client_id={CLIENT_ID}&
redirect_uri={REDIRECT_URI}&
scope=https://www.googleapis.com/auth/drive.metadata.readonly&
access_type=offline&
prompt=consent
其他的prompt值的含义
prompt
属性是 Google OAuth2
授权时可以用到的一个参数,它用于指定用户登录和授权行为。以下是prompt
属性可能的取值:
none
:表示要求无交互式用户登录或授权。只确定是否存在有效的用户会话,并需要访问令牌等凭据,如果用户未登录,则会返回“未找到身份验证”,而不会提示用户进行登录。consent
:表示要求用户授权,无论他们以前是否已经授权过。通常使用此选项,每次授权都会让用户看到授权屏幕,因此只能在条件允许的情况下使用。select_account
:表示只要求用户选择帐户,而无需进行授权。在需要让用户从多个会话中进行选择时,通常使用此选项。login
:表示要求用户进行登录和授权。
默认情况下,如果该参数没有指定,则该值为default
,表示系统将选择要使用的标准流程。请注意,Google对prompt参数的支持可能随时发生变化,用户需要查看最新的Google文档来确认审核参数是否需要更新。
其他注意事项
当用户授权成功后,Google 认证服务器将会返回一个授权码 code,并根据 access_type=offline 的设置,同时也会返回一个 Refresh Token。开发者应该将 Refresh Token 持久化存储,以便在后续使用时使用。例如可以将 Refresh Token 存储到数据库中,或者加密后存储在文件或配置中。
值得注意的是,开发者应该妥善保管用户的 Refresh Token,不应该将其存储在明文或者公开可见的地方,以避免被攻击者盗用。