用户认证(User Authentication)
警告
重要提示:Chrome 将在所有平台上取消对 Chrome 应用程序的支持。 Chrome 浏览器和 Chrome 网上应用店将继续支持扩展程序。阅读公告并了解有关迁移应用程序的更多信息。
Web 身份验证协议利用 HTTP 功能,但 Chrome 应用程序在应用程序容器内运行;它们不能通过 HTTP 加载,也不能执行重定向或设置 cookie。
使用 Chrome Identity API 对用户进行身份验证:登录 Google 帐户的用户的 getAuthToken
和登录非 Google 帐户的用户的 launchWebAuthFlow
。如果您的应用使用自己的服务器对用户进行身份验证,则您需要使用后者。
# 这个怎么运作(How it works)
Chrome Apps 用户有一个与其个人资料相关联的 Google 帐户。应用程序可以使用 getAuthToken
API 为这些用户获取 OAuth2 令牌。
想要使用非 Google 身份提供商执行身份验证的应用程序必须调用 launchWebAuthFlow
。此方法使用浏览器弹出窗口来显示提供程序页面并捕获到特定 URL 模式的重定向。重定向 URL 被传递到应用程序,应用程序从 URL 中提取令牌。
# 谷歌账户认证(Google account authentication)
以下是您需要完成的五个步骤:
- 为您的清单添加权限并上传您的应用程序。
- 将已安装的
manifest.json
中的密钥复制到您的源清单,以便您的应用程序 ID 在开发过程中保持不变。 - 为您的 Chrome 应用获取 OAuth2 客户端 ID。
- 更新您的清单以包含客户端 ID 和范围。
- 获取身份验证令牌。
# 添加权限并上传应用(Add permissions and upload app)
您需要确保身份权限在您的清单中。然后,您可以将您的应用程序上传到应用程序和扩展程序管理页面(请参阅发布)。
"permissions": [
"identity"
]
# 将密钥复制到您的清单(Copy key to your manifest)
当您在 Google OAuth 控制台中注册您的应用程序时,您将提供您的应用程序 ID,该 ID 将在令牌请求期间进行检查。因此,在开发过程中拥有一致的应用程序 ID 很重要。
为了保持您的应用程序 ID 不变,您需要将已安装的 manifest.json
中的密钥复制到您的源清单中。这不是最优雅的任务,但它是如何进行的:
- 转到您的用户数据目录。 MacO 上的示例:
~/Library/Application\ Support/Google/Chrome/Default/Extensions
- 列出已安装的应用程序和扩展程序,并将应用程序和扩展程序管理页面上的应用程序 ID 与此处的相同 ID 匹配。
- 转到已安装的应用程序目录(这将是应用程序 ID 中的一个版本)。打开已安装的
manifest.json
(pico 是打开文件的快捷方式)。 - 复制已安装的 manifest.json 中的“密钥”并将其粘贴到您的应用程序的源清单文件中。
# 获取您的 OAuth2 客户端 ID
您需要在 Google API 控制台中注册您的应用以获取客户端 ID:
- 使用用于将您的应用程序上传到 Chrome 网上应用店的同一 Google 帐户登录到 Google API 控制台。
- 通过展开左上角的下拉菜单并选择 Create... 菜单项来创建一个新项目。
- 创建并命名后,转到“服务(Services)”导航菜单项并打开您的应用所需的任何 Google 服务。
- 转到“API 访问(API Access)”导航菜单项,然后单击“创建 OAuth 2.0 客户端 ID...(Create an OAuth 2.0 client ID...)”蓝色按钮。
- 输入所需的品牌信息,选择已安装的应用程序类型。
- 选择 Chrome 应用程序并输入您的应用程序 ID(与应用程序和扩展程序管理页面中显示的 ID 相同)。
警告
警告:如果此处的应用 ID 与您的应用 ID 不匹配,则您的应用调用 getAuthToken() 时会发生错误。
# 使用 OAuth2 客户端 ID 和范围更新您的清单
您需要更新清单以包含客户端 ID 和范围。以下是 gdrive 示例的示例“oauth2”:
"oauth2": {
"client_id": "665859454684.apps.googleusercontent.com",
"scopes": [
"https://www.googleapis.com/auth/drive"
]
}
# 获取访问令牌(Get access tokens)
您现在可以通过调用 identity.getAuthToken 来获取身份验证令牌。
chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
// Use the token.
});
# User interaction(用户互动)
在调用 getAuthToken 时,您可以传递一个标志(在上面的示例中为“interactive”:true
),指示您希望 API 在交互模式还是静默模式下被调用。如果您以交互模式调用 API,则会在必要时向用户显示登录和/或批准 UI,如下面的屏幕截图所示:
如果您在静默模式下调用 API,则 API 只会返回一个令牌,前提是可以在不显示任何 UI 的情况下生成令牌。这在应用程序在应用程序启动时执行流程的情况下非常有用,例如,或者通常在不涉及用户手势的情况下。
我们建议的最佳做法是在不涉及用户手势时使用静音模式,如果有用户手势则使用交互模式(例如,用户在您的应用中单击了登录按钮)。请注意,我们不强制执行任何手势要求。
# Caching(缓存)
Chrome 具有访问令牌的内存缓存,因此您可以在需要使用令牌的任何时候调用 getAuthToken
。令牌过期由缓存自动处理。
您可以在 chrome://identity-internals
上查看令牌缓存的当前状态。
在某些情况下,例如当用户更改密码时,未过期的访问令牌将停止工作。使用令牌的 API 调用将开始返回 HTTP 状态代码 401。如果您检测到这种情况发生,您可以通过调用 identity.removeCachedAuthToken 从 Chrome 的缓存中删除无效的令牌。
removeCachedAuthToken
用法示例:
// callback = function (error, httpStatus, responseText);
function authenticatedXhr(method, url, callback) {
var retry = true;
function getTokenAndXhr() {
chrome.identity.getAuthToken({/* details */},
function (access_token) {
if (chrome.runtime.lastError) {
callback(chrome.runtime.lastError);
return;
}
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.setRequestHeader('Authorization',
'Bearer ' + access_token);
xhr.onload = function () {
if (this.status === 401 && retry) {
// This status may indicate that the cached
// access token was invalid. Retry once with
// a fresh token.
retry = false;
chrome.identity.removeCachedAuthToken(
{ 'token': access_token },
getTokenAndXhr);
return;
}
callback(null, this.status, this.responseText);
}
});
}
}
# 非 Google 帐户身份验证
以下是您需要完成的三个步骤:
- 向提供商注册。
- 为您的应用程序将访问的提供程序资源添加权限。
- 获取身份验证令牌。
# 在供应商处注册
您需要向提供商注册 OAuth2 客户端 ID,并将客户端 ID 配置为网站。要在注册期间输入重定向 URI,请使用以下形式的 URL:https://<extension-id>.chromiumapp.org/<anything-here>
例如,如果您的应用程序 ID 是 abcdefghijklmnopqrstuvwxyzabcdef
并且您希望 provider_cb
是路径,以使用重定向 URI 与其他提供程序进行区分,您应该使用:
https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb
# 为提供者添加权限
要向提供者 API 端点制作跨源 XHR,您需要在权限中将适当的模式列入许可名单:
"permissions": [
...
"https://www.website-of-provider-with-user-photos.com/photos/*"
]
# 获取令牌
获取令牌:
chrome.identity.launchWebAuthFlow(
{'url': '<url-to-do-auth>', 'interactive': true},
function(redirect_url) { /* Extract token from redirect_url */ });
这就是从网站对提供者进行身份验证的任何 URL。例如,假设您正在与提供商执行 OAuth2 流程,并且已使用客户端 ID 123456789012345 注册您的应用程序,并且您希望访问提供商网站上的用户照片:https://www.website-of-provider-with-user-photos.com/dialog/oauth?client_id=123456789012345& redirect_uri=https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb&response_type=token&scope=user_photos
提供者将执行身份验证,如果合适,将向用户显示登录和/或批准 UI。然后它将重定向到https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb#authToken=<auth-token>
Chrome 将捕获它并使用完整的重定向 URL 调用应用程序的回调。应用程序应从 URL 中提取令牌。
# 交互模式与静音模式
调用launchWebAuthFlow
时,您可以传递一个标志(上面示例中的'interactive':true
)指示您是否希望以交互模式(又名静默模式)调用API。如果您在交互模式下调用 API,则会在必要时向用户显示 UI,以获取令牌(登录 UI 和/或批准 UI;或就此而言任何特定于提供者的 UI)。
如果您以静默模式调用 API,则 API 只会在提供者能够提供令牌而不显示任何 UI 的情况下返回令牌。这在应用程序在应用程序启动时执行流程的情况下非常有用,例如,或者通常在不涉及用户手势的情况下。
我们建议的最佳做法是在不涉及用户手势时使用静默模式,如果有用户手势(例如,用户单击应用中的登录按钮)则使用交互模式。请注意,我们不强制执行手势要求。
By.一粒技术服务