gpt4 book ai didi

api - 在通过第三方服务授权后,如何使用 OAuth 2.0 保持 session ?

转载 作者:行者123 更新时间:2023-12-02 20:45:02 24 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




我正在为我正在开发的应用程序实现基于 OAuth 2 的授权模型。我为最终用户提供了使用 Facebook 登录或使用我的 API 设置电子邮件/密码帐户的功能。使用密码授权进行电子邮件/密码身份验证非常简单。我正在寻求有关 Facebook 登录流程的帮助。

我的应用程序是一个单页应用程序,它使用 JSON API(我的“资源服务器”)。我正在使用 Facebook JavaScript SDK 授权 Web 应用程序访问最终用户的电子邮件地址。

当用户尝试使用 Facebook 登录时,整个过程发生在 Facebook 和 Web 应用程序之间。因此,我的 API 无法信任 Facebook 授权 token ,直到它使用 Facebook 的 OAuth 服务器验证 token 。

截至目前,我正在通过 Facebook accessToken到我的 API,然后通过“我”图形 API 的服务器到服务器调用验证用户对 Facebook 的授权。这是我当前设置的说明:

My current OAuth flow

所以,此时,我有一个 Facebook 访问 token 和一个电子邮件地址。我需要在我的 API 服务器和 Web 应用程序之间保持我的 session 。此时保持 session 的标准方法是什么?

从阅读 OAuth 文档来看,这种情况似乎需要在我的 API 服务器和 Web 应用程序之间进行“隐式授权”,但该授权类型在 OAuth package I'm using 中不可用。 .也是该包的作者 says implicit grants are "very insecure" .

我的另一个想法是我可以创建一个随机的客户端 ID 和客户端 key ,然后将它们传递回 Web 应用程序,以便它可以通过凭据授予请求访问 token 。这对我来说似乎不合逻辑。为什么我不直接创建一个访问 token 并将其发送回客户端以直接使用?

在获得 Facebook 的初始授权后,我应该直接在我的 Web 应用程序和 API 服务器之间维护身份验证,对吗?

我意识到我可以只生成一个随 secret 码并向用户发送一个 HTTP 基本 token ,但我更喜欢使用 OAuth,除非没有任何好处。

最佳答案

如果可以,您可以在 oauth 实现中编写自己的自定义授权类和身份验证提供程序。

为这种身份验证定义一个新的客户端 ID。

  • 用户通过使用 Facebook 进行身份验证。
  • Facebook 为客户端生成 token 。
  • 客户端向您的后端发送请求
    具有此访问 token 、电子邮件地址和身份验证的应用程序
    类型/客户 ID(可以说是“facebook”)
  • 您的自定义拨款决定
    将使用哪种 token 。你可以控制客户端
    id/认证类型(上图)。
  • 如果身份验证类型是“facebook”,您
    如果访问 token 不在您这里,则会向 session 存储询问该访问 token
    将询问 Facebook api,然后如果没问题,请将其保存在您的
    session 存储(数据库,redis 什么的)。我们把一个 session 存储放在不
    每次都问fb。(这是非常基本的概念)
  • 然后 oauth 将
    使用您的配置返回 token 。
  • 您的客户端将发送带有客户端 ID/身份验证类型的下一个请求的 token 。凭据将是 facebook token ,电子邮件将是用户名。

  • 自定义授权决定 token 类型(Spring security-oauth 实现)
        String clientId = tokenRequest.getClientId();
    ClientDetails client = clientDetailsService.loadClientByClientId(clientId);
    Map<String, String> parameters = tokenRequest.getRequestParameters();
    String username = parameters.get("username"); //username is email
    String password = parameters.get("password"); //password is fb access token
    Authentication authentication = null;
    if ("facebook".equals(clientId)) {
    authentication = new FacebookAuthenticationToken(username, password);
    } else {
    authentication = new UserAuthenticationToken(username, password);
    }
    authentication = authenticationManager.authenticate(authentication);

    身份验证提供程序检查 facebook token 并验证它。
    public class FacebookAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private FacebookApi facebookApi;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String username = authentication.getName();
    String password = (String) authentication.getCredentials();
    // you can check your facebook session store
    boolean valid = facebookApi.isValidToken(username, password);

    if (!valid) {
    throw new BadCredentialsException("Username not found.");
    }

    Collection<? extends GrantedAuthority> authorities = user.getAuthorities();

    return new FacebookAuthenticationToken(user, password, authorities);
    }

    @Override
    public boolean supports(Class<?> authentication) {
    return FacebookAuthenticationToken.class.isAssignableFrom(authentication);
    }
    }

    我把代码作为示例。

    我通常会强制用户在第一次 facebook 登录(收到他们的电子邮件)后为我的内部应用设置密码。然后一切都变得更加简单。你可以明白我的意思。

    关于api - 在通过第三方服务授权后,如何使用 OAuth 2.0 保持 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34732924/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com