深入理解ueberauth/guardian中的实现模块
guardian Elixir Authentication 项目地址: https://gitcode.com/gh_mirrors/gu/guardian
概述
在Elixir生态系统中,ueberauth/guardian是一个强大的认证解决方案,它提供了一种灵活且安全的方式来处理用户认证流程。本文将重点解析guardian中的实现模块(Implementation Modules),这是与guardian交互的核心组件。
实现模块的作用
实现模块是应用程序与guardian交互的主要接口。它封装了开发者指定的配置和行为,并通过令牌后端(默认使用JWT)来实现所选令牌类型的细节处理。
与早期版本相比,当前架构的优势在于:
- 支持多种令牌类型
- 配置更加灵活
- 定制化更加简单直观
核心功能
令牌的编码与解码
实现模块提供了几个关键函数来处理认证令牌:
# 创建令牌
{:ok, token, full_claims} = MyApp.TokenImpl.encode_and_sign(user)
# 解码令牌
{:ok, claims} = MyApp.TokenImpl.decode_and_verify(token_string)
# 一步完成解码和资源获取
{:ok, user, claims} = MyApp.TokenImpl.resource_from_token(token_string)
在创建令牌时,可以添加自定义声明(claims)。最终的令牌声明将是以下内容的合并结果(按应用顺序):
- 令牌模块提供的基础声明
- 传入的自定义声明
- 在
Guardian.build_claims
回调中进行的任何修改
基本设置
一个最基本的实现模块需要包含以下内容:
defmodule MyApp.TokenImpl do
use Guardian, otp_app: :my_app
def subject_for_token(resource, options) do
{:ok, resource.id}
end
def resource_from_claims(claims) do
# 根据claims["sub"]或其他存储的信息查找用户
end
end
其中subject_for_token
和resource_from_claims
是两个必须实现的函数,它们互为逆操作:
subject_for_token
:提供要编码到令牌中的标识符resource_from_claims
:使用上述标识符查找关联的资源
高级主题
主题标识设计
在设计subject_for_token
返回的主题标识时,需要考虑以下几点:
- 如果有多类结构体需要认证,建议使用前缀标识类型
- 一旦令牌发布,需要支持所有主题方案直到令牌过期或被撤销
- 前缀设计便于模式匹配
示例实现:
def subject_for_token(%User{uid: uid} = user, _claims) do
{:ok, "User:#{uid}"}
end
def resource_from_claims(%{"sub" => "User:" <> uid}) do
# 查找用户逻辑
end
配置管理
配置可以通过两种方式提供:
- 在配置文件中使用与
use Guardian
相同的otp_app
标识符 - 直接在
use Guardian
调用中提供选项
实现模块中的配置优先于配置文件中的配置,可以混合使用以适应不同环境。
回调函数
Guardian提供了多种回调函数来介入认证生命周期的不同阶段:
build_claims
:修改声明结构verify_claims
:实现自定义验证逻辑
这些回调为开发者提供了极大的灵活性,可以用于各种定制需求。
最佳实践
- 令牌设计:精心设计主题标识格式,考虑未来的扩展性
- 错误处理:为所有可能的错误情况提供明确的错误响应
- 声明验证:利用
verify_claims
实现业务相关的验证逻辑 - 环境适配:合理分配配置到不同环境
通过深入理解guardian的实现模块,开发者可以构建出既安全又灵活的认证系统,满足各种复杂的业务需求。
guardian Elixir Authentication 项目地址: https://gitcode.com/gh_mirrors/gu/guardian
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考