Play 2.6 Play对OpenID的支持

27 篇文章 2 订阅
3 篇文章 0 订阅

Play对OpenID的支持

https://playframework.com/documentation/2.6.x/JavaOpenID

OpenID是一种协议,允许使用一个帐号来登入多个服务。作为一名Web开发这,你可以让用户使用一个他们已经拥有的账户(比如谷歌账户)来登录。在企业内,可以使用OpenID来连接SSO服务。

OpenID的流程

  1. 用户想给你提供了他的OpenID(一个URL)
  2. 你的服务需要获取URL后面的内容来生成一个重定向用URL
  3. 用户在他的OpenID提供者上进行确认,然后重定向到你的服务中
  4. 你的服务从重定向哪里收到了信息,然后检查信息是否正确

如果你的用户都使用通过一OpenID提供者,第一步可以省略(比如你觉得完全依赖谷歌账户)

使用

首先需要添加依赖

libraryDependencies ++= Seq(
  openId
)

现在任何需要OpenID的组件都需要声明一个OpenIdClient

Play中的OpenID

OpenID有两个主要的函数
- OpenIdClient.redirectURL计算你需要让用户重定向的URL。该方法会异步的调用用户OpenID页面,所以返回值为CompletionStage。如果OpenID非法,CompletionStage会包含一个异常。
- OpenIdClient.verifiedId检查现有的请求来建立用户数据,包括他的OpenID。该方法异步调用OpenID服务器来检测验证信息,返回一个CompletionStage。如果信息不正常或者服务器检测失败(比如重定向的URL被伪造了),返回的CompletionStage 为以一个异常结束。
如果CompletionStage失败,你可以定一个fallback,重定向到登录界面或者返回一个BadRequest

Example

conf/routes

GET     /openID/login               controllers.OpenIDController.login()
POST    /openID/login               controllers.OpenIDController.loginPost()
GET     /openID/callback            controllers.OpenIDController.openIDCallback()

controller

import java.util.*;
import java.util.concurrent.CompletionStage;

import play.data.*;
import play.libs.openid.*;
import play.mvc.*;

import javax.inject.Inject;

public class OpenIDController extends Controller {

    @Inject
    OpenIdClient openIdClient;

    @Inject
    FormFactory formFactory;

    public Result login() {
        return ok(views.html.login.render(""));
    }

    public CompletionStage<Result> loginPost() {

        // Form data
        DynamicForm requestData = formFactory.form().bindFromRequest();
        String openID = requestData.get("openID");

        CompletionStage<String> redirectUrlPromise =
                openIdClient.redirectURL(openID, routes.OpenIDController.openIDCallback().absoluteURL(request()));

        return redirectUrlPromise
                .thenApply(Controller::redirect)
                .exceptionally(throwable ->
                                badRequest(views.html.login.render(throwable.getMessage()))
                );
    }

    public CompletionStage<Result> openIDCallback() {

        CompletionStage<UserInfo> userInfoPromise = openIdClient.verifiedId();

        CompletionStage<Result> resultPromise = userInfoPromise.thenApply(userInfo ->
                        ok(userInfo.id() + "\n" + userInfo.attributes())
        ).exceptionally(throwable ->
                        badRequest(views.html.login.render(throwable.getMessage()))
        );

        return resultPromise;
    }

    public static class views {
        public static class html {
            public static class login {
                public static Html render(String msg) {
                    return javaguide.ws.html.login.render(msg);
                }
            }
        }
    }

}

扩展属性

OpenID协议也支持获取扩展属性像是email名字等。

你可以请求额外的属性或者从OpenID服务器中获取。请求额外的属性表明如果用户不能提供这些属性,将不能登录你的服务器。

扩展属性将在重定向URL中使用

Map<String, String> attributes = new HashMap<>();
attributes.put("email", "http://schema.openid.net/contact/email");

CompletionStage<String> redirectUrlPromise = openIdClient.redirectURL(
        openID,
        routes.OpenIDController.openIDCallback().absoluteURL(request()),
        attributes
);

现在可以使用UserInfo中的属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值