首页 ntes_openid_dev

ntes_openid_dev

举报
开通vip

ntes_openid_dev OpenID认证接入开发文档 前提 确认你的应用(WEB站点)所在服务器可以访问 OpenID Server。一般通过在你 应用所在服务器执行如下命令进行判断: ping login.netease.com 如果成功返回类似如下数据,说明应用所在服务器与OpenID Server之间的网络 是正常的: PING login.netease.com (220.181.28.11): 56 data bytes 64 bytes from 220.181.28.11: icmp_seq=0 ttl=50 tim...

ntes_openid_dev
OpenID认证接入开发文档 前提 确认你的应用(WEB站点)所在服务器可以访问 OpenID Server。一般通过在你 应用所在服务器执行如下命令进行判断: ping login.netease.com 如果成功返回类似如下数据,说明应用所在服务器与OpenID Server之间的网络 是正常的: PING login.netease.com (220.181.28.11): 56 data bytes 64 bytes from 220.181.28.11: icmp_seq=0 ttl=50 time=43.194 ms 1. 关联请求 OpenID Server https://login.netease.com/openid/ 组织关联数据 openid.mode=associate&openid.assoc_type=HMAC- SHA256&openid.session_type=no-encryption openid.mode: associate表示这是一个关联请求 openid.assoc_type: HMAC-SHA256,安全考虑,推荐使用HMAC- SHA256 openid.session_type: no-encryption,由于我们已经使用https,这里采用 no-necryption即可 使用 HTTP POST 向 OpenID Server 提交 关联数据,OpenID Server将返回如下 内容: assoc_handle:{HMAC-SHA256}{52ae73e1}{JhSjeA==} assoc_type:HMAC-SHA256 expires_in:86400 mac_key:1V0mT0G6sZMmCrftbQbnTP3+fKgKo/tB0Gc+RG5vNqU= HTTP状态码一定为200.返回的内容以换行符分割,内容为键值对形式。 assoc_handle 贯穿于整过认证过程,需要使用该数据发起认证请求 assoc_type 实际上就是 关联数据 里 assoc_type 指定的值 expires_in 本次handle的过期时间 mac_key 非常重要,不能泄露,最后将采用此值进行 OpenID Server 返回 的签名校验。 通常来说,在WEB应用中,这个时候你需要把assoc_handle/mac_key保存在一 个固定的地方(可以是session或者后端文件,又或者是数据库),但一定不能放 在cookie里! 另外,推荐将该assoc_handle/mac_key等信息保存在数据库中用于下一次认证 (需要注意,expires_in表示该关联数据的有效时间,单位为秒,该关联数据失效 后,需要重新向服务器发起关联请求)。你也可以在用户每次要求登录的时候, 都向OpenID Server要求获取一份关联数据,用于发起本次认证请求。 2. 发起认证请求 组织认证请求的参数,包含基础参数及扩展参数 基础参数 openid.ns 固定字符串,内容为 http://specs.openid.net/auth/2.0 openid.mode 固定字符串,内容为 checkid_setup openid.assoc_handle 关联请求时获取的assoc_handle值 openid.return_to 用户在OpenID Server认证成功后,跳转回的完整URL地 址 openid.claimed_id 固定字符串,为 http://specs.openid.net/auth/2.0/identifier_select openid.identity 固定字符串,内容为 http://specs.openid.net/auth/2.0/identifier_select openid.realm 你站点的URL地址,通常这个URL要能覆盖openid.return_to 设定的URL openid.ns.sreg 固定字符串,内容为 http://openid.net/extensions/sreg/1.1 openid.sreg.required 目前可选项为nickname、email、fullname,分别表 示昵称,邮件地址,全名(用户中文名,如果有),如果你要请求这三个 中的多个,需要以英文“,”分隔,如设置为“nickname,email”,表示希望取 得用户的昵称和邮件地址 假设我需要从站点(openid.realm) http://220.181.28.15:8831 发起认证请求,当用户在OpenID认证成功后,可以返回(openid.return_to) http://220.181.28.15:8831/consumer/ 并且我希望可以拿到用户基本信息里的(openid.sreg.required) nickname email fullname 假设,我在第一步关联请求那里,获取到的assoc_handle为 {HMAC-SHA256} {52ae73e1}{JhSjeA==} ,mac_key为 1V0mT0G6sZMmCrftbQbnTP3+fKgKo/tB0Gc+RG5vNqU= 那么,我的应用需要 通知用户跳转至如下URL: https://login.netease.com/openid/? openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fa uth%2F2.0&openid.realm=http%3A%2F%2F220.181.28.15%3A8831%2F&openid.sr eg.required=nickname%2Cemail%2Cfullname&openid.assoc_handle=%7BHMAC- SHA256%7D%7B52ae73e1%7D%7BJhSjeA%3D%3D%7D&openid.return_to=http%3A%2F %2F220.181.28.15%3A8831%2Fconsumer%2F&openid.ns.sreg=http%3A%2F%2Fope nid.net%2Fextensions%2Fsreg%2F1.1&openid.identity=http%3A%2F%2Fspecs. openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.claimed_id=http%3A %2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select 方便查看,上面的URL,在不做url编码的情况下应该是以下内容: https://login.netease.com/openid/? openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0& openid.realm=http://220.181.28.15:8831/&openid.sreg.required=nickname ,email,fullname&openid.assoc_handle={HMAC-SHA256}{52ae73e1} {JhSjeA==}&openid.return_to=http://220.181.28.15:8831/consumer/&openi d.ns.sreg=http://openid.net/extensions/sreg/1.1&openid.identity=http: //specs.openid.net/auth/2.0/identifier_select&openid.claimed_id=http: //specs.openid.net/auth/2.0/identifier_select 应用通知URL跳转到如上URL后,后面的过程就是用户与OpenID Server的交互过 程了,直到用户在OpenID Server那边认证成功,并跳转回应用设定的 (openid.return_to)后,进入下一个阶段 3. 数据校验 当用户访问上面的URL,并成功验证后,根据应用设置的openid.return_to,应用 将通知用户跳转回如下地址: http://220.181.28.15:8831/consumer/?openid.assoc_handle={HMAC-SHA256} {52ae73e1} {JhSjeA%3D%3D}&openid.ax.mode=fetch_response&openid.claimed_id=https% 3A%2F%2Flogin.netease.com%2Fopenid%2Fchenxs%2F&openid.identity=https% 3A%2F%2Flogin.netease.com%2Fopenid%2Fchenxs%2F&openid.mode=id_res&ope nid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.ax=http%3 A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ns.sreg=http%3A%2F%2Fopenid .net%2Fextensions%2Fsreg%2F1.1&openid.op_endpoint=https%3A%2F%2Flogin .netease.com%2Fopenid%2F&openid.response_nonce=2013-12- 16T03%3A34%3A49ZrhjPaT&openid.return_to=http%3A%2F%2F220.181.28.15%3A 8831%2Fconsumer%2F&openid.sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y%2BTQCYBjH lv7kGk%3D&openid.signed=assoc_handle%2Cax.mode%2Cclaimed_id%2Cidentit y%2Cmode%2Cns%2Cns.ax%2Cns.sreg%2Cop_endpoint%2Cresponse_nonce%2Cretu rn_to%2Csigned%2Csreg.email%2Csreg.fullname%2Csreg.nickname&openid.sr eg.email=chenxs%40corp.netease.com&openid.sreg.fullname=陈⼩小⽣生 &openid.sreg.nickname=chenxs 方便查看,提供如下未经URL编码的链接: http://220.181.28.15:8831/consumer/?openid.assoc_handle={HMAC-SHA256} {52ae73e1} {JhSjeA==}&openid.ax.mode=fetch_response&openid.claimed_id=https://lo gin.netease.com/openid/chenxs/&openid.identity=https://login.netease. com/openid/chenxs/&openid.mode=id_res&openid.ns=http://specs.openid.n et/auth/2.0&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ns.sreg= http://openid.net/extensions/sreg/1.1&openid.op_endpoint=https://logi n.netease.com/openid/&openid.response_nonce=2013-12- 16T03:34:49ZrhjPaT&openid.return_to=http://220.181.28.15:8831/consume r/&openid.sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk=&openid.sig ned=assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax,ns.sreg,op _endpoint,response_nonce,return_to,signed,sreg.email,sreg.fullname,sr eg.nickname&openid.sreg.email=chenxs@corp.netease.com&openid.sreg.ful lname=陈⼩小⽣生&openid.sreg.nickname=chenxs 为了更方便查看,对上面URL里的参数进行分解: openid.op_endpoint=https://login.netease.com/openid/ openid.sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk= openid.return_to=http://220.181.28.15:8831/consumer/ openid.ns=http://specs.openid.net/auth/2.0 openid.sreg.fullname=陈⼩小⽣生 openid.response_nonce=2013-12-16T03:34:49ZrhjPaT openid.ax.mode=fetch_response openid.claimed_id=https://login.netease.com/openid/chenxs/ openid.ns.sreg=http://openid.net/extensions/sreg/1.1 openid.sreg.nickname=chenxs openid.ns.ax=http://openid.net/srv/ax/1.0 openid.signed=assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax, ns.sreg,op_endpoint,response_nonce,return_to,signed,sreg.email,sreg.f ullname,sreg.nickname openid.assoc_handle={HMAC-SHA256}{52ae73e1}{JhSjeA==} openid.mode=id_res openid.identity=https://login.netease.com/openid/chenxs/ openid.sreg.email=chenxs@corp.netease.com 我们可以看到其中一个参数为 openid.signed=assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax, ns.sreg,op_endpoint,response_nonce,return_to,signed,sreg.email,sreg.f ullname,sreg.nickname 这个参数表示,OpenID Server对这些key及其对应的值,做了签名。签名的值是 哪个呢? openid.sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk= 即,OpenID Server对这些内容做了签名后,算出来的值为 iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk= 那怎么校验我们得到的数据签名值是否与OpenID Server返回的一致呢,首先,我 们需要用到第一步关联数据时,取得的mac_key 1V0mT0G6sZMmCrftbQbnTP3+fKgKo/tB0Gc+RG5vNqU= 其次,我们将openid.signed得到的值以英文','分隔,并从返回的URL里,获取到 对应key的值,如openid.signed里,第一个值为assoc_handle,那么,在上述 URL里,他的Key是openid.assoc_handle,即: openid.assoc_handle={HMAC-SHA256}{52ae73e1}{JhSjeA==} 逐一将这些KEY对应的值拿出来,并按如下格式进行组织: key1:value1 key2:value2 即,键值之间通过英文':'连接,多个键值对间使用换行符连接。 "注意,换行 是"\n",非windows平台的"\r\n" 通常,在取这些值的时候,应用就可以做两个最初步的校验: I. openid.mode 是否为id_res openid.identity 是否以 https://login.netease.com/openid/ 开始 通常,这两个中的任何一个不满足,你都可以直接认为他认证不成功。 II. openid.assoc_handle 是否与1.关联数据获取的assoc_handle⼀一致,如果不⼀一致,请直 接看4. 依赖OpenID Server的数据校验 完成这两步校验后,将需要验证签名的key及其对应的值进行组织,得到如下内 容:: assoc_handle:{HMAC-SHA256}{52ae73e1}{JhSjeA==} ax.mode:fetch_response claimed_id:https://login.netease.com/openid/chenxs/ identity:https://login.netease.com/openid/chenxs/ mode:id_res ns:http://specs.openid.net/auth/2.0 ns.ax:http://openid.net/srv/ax/1.0 ns.sreg:http://openid.net/extensions/sreg/1.1 op_endpoint:https://login.netease.com/openid/ response_nonce:2013-12-16T03:34:49ZrhjPaT return_to:http://220.181.28.15:8831/consumer/ signed:assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax,ns.sreg ,op_endpoint,response_nonce,return_to,signed,sreg.email,sreg.fullname ,sreg.nickname sreg.email:chenxs@corp.netease.com sreg.fullname:陈⼩小⽣生 sreg.nickname:chenxs 注意最后的sreg.nickname:chenxs后面也是有一个"\n"的,然后使用第一步获取 到的mac_key对如上内容进行hmac-sha256计算digest,并使用base64进行 encode,即得到上述内容的签名值。 这里以Python代码做为示例: >>> import hashlib >>> import hmac >>> import base64 >>> mac_key = "1V0mT0G6sZMmCrftbQbnTP3+fKgKo/tB0Gc+RG5vNqU=" >>> >>> b64decode_mac_key = base64.b64decode( mac_key ) >>> >>> openid_response_content="""assoc_handle:{HMAC-SHA256}{52ae73e1} {JhSjeA==} ... ax.mode:fetch_response ... claimed_id:https://login.netease.com/openid/chenxs/ ... identity:https://login.netease.com/openid/chenxs/ ... mode:id_res ... ns:http://specs.openid.net/auth/2.0 ... ns.ax:http://openid.net/srv/ax/1.0 ... ns.sreg:http://openid.net/extensions/sreg/1.1 ... op_endpoint:https://login.netease.com/openid/ ... response_nonce:2013-12-16T03:34:49ZrhjPaT ... return_to:http://220.181.28.15:8831/consumer/ ... signed:assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax,ns.sreg ,op_endpoint,response_nonce,return_to,signed,sreg.email,sreg.fullname ,sreg.nickname ... sreg.email:chenxs@corp.netease.com ... sreg.fullname:陈⼩小⽣生 ... sreg.nickname:chenxs ... """ >>> hmac_sha256_digest = hmac.new( b64decode_mac_key, openid_response_content, hashlib.sha256 ).digest() >>> base64_digest = base64.b64encode( hmac_sha256_digest ) >>> print base64_digest iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk= >>> 计算后得到的base64_digest若与openid.sig一致,校验签名成功,否则你可以认 为认证不成功。校验成功后,你就可以进行你应用站点的登录逻辑了(比如判断 是否有这个用户,是否允许他登录等等,并记录session等等) 4. 依赖OpenID Server的数据校验 如果你已经做了第⼀一步关联操作(associate),并且第⼀一步获取的assoc_handle和第三步 系统返回的openid.assoc_handle⼀一致的情况下,不允许做这⼀一步操作(⼀一定会返回 False) 通常情况下,你只要执行至3. 数据校验,你的OpenID认证过程就算完成了,但在 某些时候,如3. 数据校验章节提到的,由于某些原因,你在2. 发起认证请求时, 发送给OpenID Server的openid.assoc_handle值并不被接受(比如你想偷懒,没 有做第一步关联操作,直接在第二步里将openid.assoc_handle的值设置为空), 这个时候,你在3. 数据校验章节里,会检测到你的openid.assoc_handle和 OpenID Server返回给你的并不一致,这个时候,你无法直接在本地做数据签名 校验,应用需要向OpenID Server发起数据校验的请求: check_authentication 该请求相当简单,只要将OpenID Server返回的请求,修改openid.mode为 check_authentication,并将所有数据原样以http post方式发回给OpenID Server 即可。 看回第三步我们取出来的OpenID Server返回的数据 openid.op_endpoint=https://login.netease.com/openid/ openid.sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y+TQCYBjHlv7kGk= openid.return_to=http://220.181.28.15:8831/consumer/ openid.ns=http://specs.openid.net/auth/2.0 openid.sreg.fullname=陈⼩小⽣生 openid.response_nonce=2013-12-16T03:34:49ZrhjPaT openid.ax.mode=fetch_response openid.claimed_id=https://login.netease.com/openid/chenxs/ openid.ns.sreg=http://openid.net/extensions/sreg/1.1 openid.sreg.nickname=chenxs openid.ns.ax=http://openid.net/srv/ax/1.0 openid.signed=assoc_handle,ax.mode,claimed_id,identity,mode,ns,ns.ax, ns.sreg,op_endpoint,response_nonce,return_to,signed,sreg.email,sreg.f ullname,sreg.nickname openid.assoc_handle={HMAC-SHA256}{52ae73e1}{JhSjeA==} openid.mode=id_res openid.identity=https://login.netease.com/openid/chenxs/ openid.sreg.email=chenxs@corp.netease.com check_authentication就是把上面的openid.mode值替换为字符串 check_authentication,然后将所有数据POST回OpenID Server(https://login.netease.com/openid/)即可。如: openid.op_endpoint=https%3A%2F%2Flogin.netease.com%2Fopenid%2F&openid .sig=iKfshlYzRgH5Mo80TrEV2RQvNk88y%2BTQCYBjHlv7kGk%3D&openid.return_t o=http%3A%2F%2F220.181.28.15%3A8831%2Fconsumer%2F&openid.ns=http%3A%2 F%2Fspecs.openid.net%2Fauth%2F2.0&openid.sreg.fullname=%E9%99%88%E5%B 0%8F%E7%94%9F&openid.response_nonce=2013-12- 16T03%3A34%3A49ZrhjPaT&openid.ax.mode=fetch_response&openid.claimed_i d=https%3A%2F%2Flogin.netease.com%2Fopenid%2Fchenxs%2F&openid.ns.sreg =http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&openid.sreg.nickna me=chenxs&openid.ns.ax=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openi d.signed=assoc_handle%2Cax.mode%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2 Cns.ax%2Cns.sreg%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Csigned% 2Csreg.email%2Csreg.fullname%2Csreg.nickname&openid.assoc_handle=%7BH MAC- SHA256%7D%7B52ae73e1%7D%7BJhSjeA%3D%3D%7D&openid.mode=check_authentic ation&openid.identity=https%3A%2F%2Flogin.netease.com%2Fopenid%2Fchen xs%2F&openid.sreg.email=chenxs%40corp.netease.com 服务器将返回如下内容: is_valid:true ns:http://specs.openid.net/auth/2.0 只要返回的内容中,其中一行为"is_valid:true",即可认为校验成功,否则应用可 以直接认为用户认证失败。 Examples Python https://login.netease.com/download/pure_python_openid_demo.py Java https://login.netease.com/download/openid_for_java.zip FAQ Java访问https,不信任cnnic证书怎么办? 参考:https://login.netease.com/static/help.html OpenID通讯过程,中文使用什么编码? UTF-8。如果你的服务器环境确实有⾮非常复杂的编码问题,建议你不要获取⽤用户fullname(真 实中⽂文姓名)、openid.ax.type.dep(部⻔门)。 终极偷懒方案: 省略第⼀一步,第⼆二步直接发起认证请求,其中openid.assoc_handle请设置为空值 OpenID Server返回后,校验openid.mode是否为id_res及openid.identity是否以 https://login.netease.com/openid/ 开始后,修改openid.mode为 check_authentication,并将所有数据POST给OpenID Server(做 check_authentication)。 请一定注意,不能既做第一步关联(associate),又想偷懒直接发给服务器做 校验(check_authentication),除非服务器发给你的assoc_handle和你关联 时获得的值不一致,或者你干脆就不要进行关联操作,而是直接发起认证请求, 再进行check_authentication。 集群如何保存状态信息 对于集群,如果你希望通过第一步关联(associate)获取assoc_handle信息,并 自己在服务器本地进行校验签名信息的话,建议你的关联信息要存储在所有集群 内机器都可以读取到的地方,如Memcache,MySQL等。 或者采用无状态模 式,即不做关联,直接发起openid.assoc_handle值为空的认证请求,并将数据效 由OpenID Server进行校验。 对于 OpenID4Java 可通过如下方式实现无状态模式: this.manager = new ConsumerManager(); manager.setMaxAssocAttempts(0); 一定不要有如下两行内容(如果存在,请注释或者删除): manager.setAssociations(new InMemoryConsumerAssociationStore()); manager.setNonceVerifier(new InMemoryNonceVerifier(5000)); 对于 php-openid 可通过如下方式实现: require_once "Auth/OpenID/DumbStore.php"; $store = new Auth_OpenID_DumbStore('randomstr'); $consumer = new Auth_OpenID_Consumer; 但由于 php-openid 的一个bug(已经向官方反馈),在使用 DumbStore 的时 候,仍然发起求了 associate 请求,所以还需要对 php-openid 的 Auth/OpenID/Consumer.php 做出修改,首先找到如下这行(在 Auth_OpenID_GenericConsumer 函数里): $this->_use_assocs = (is_null($this->store) ? false : true); 在这行的后面增加如下内容(非PHP程序员做出的非专业性建议,如果您有更好 的方案,欢迎提供支持哈): if (get_class($this->store) == "Auth_OpenID_DumbStore") { $this->_use_assocs = false; } 如何申请接入流程 邮件发送: 段正域 抄送: 陈⼩小⽣生 谭健荣 邮件主题: [部⻔门][项⺫⽬目名称]OpenID接⼊入权限申请 邮件正文: 事由:XX项⺫⽬目需要使⽤用CORP邮箱帐号做为⾝身份校验,现申请OpenID接⼊入权限,详细信息如 下: http://example-org:8081 公司内⺴⽹网 corp邮箱验证 ⽆无需验证码 http://example-org:8081 公司外⺴⽹网 corp邮箱验证 需要验证码 备注: http://example-org:8081 为你站点的URL,注意URL中的域名可以为IP地址,如 果你不清楚什么是URL,可以参见:http://zh.wikipedia.org/wiki/统一资源定位符 目前认证方式会区分 公司内网 或 公司外网 ,如果你的邮件只申请了公司内网, 那么当你尝试从外网请求认证并登录你的站点时,默认不会被接受。所以,如果 你的站点需要在内外网都可以访问时,请将外网的认证方式也写上。 认证方式目前支持corp邮箱用户名密码直接校验、corp邮箱用户名密码+将军令 的方式进行较校验两种方式,将军令绑定请参考:CORP帐号绑定通行证(将军 令)指引。 外网建议开启“需要验证码”选项,防止被人恶意利用。
本文档为【ntes_openid_dev】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_328641
暂无简介~
格式:pdf
大小:277KB
软件:PDF阅读器
页数:13
分类:互联网
上传时间:2014-01-24
浏览量:142