0

次のような状況があります。

私は現在、ユーザーが自分の Google アカウントでサインインできる機能を備えた Metro スタイルのアプリケーションを作成しようとしています。アプリは、Userinfo.profile および Userinfo.email などのいくつかのアクセス許可を要求します。

このために、私は現在OAuthv2を使用しており、詳細をリクエストするとうまくいきました(かなりの努力と調査の後)。

使用した URL :

const string url = "https://accounts.google.com/o/oauth2/auth?" +
                   "client_id=" + clientId +
                   "&redirect_uri=" + "urn:ietf:wg:oauth:2.0:oob" +
                   "&response_type=code" +
                   "&scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email" +
                   "&access_type=offline";

問題は、ユーザーの認証を維持したい場合は、ユーザーがクライアント側でトークンを保存するか、Googleを使用してログインする方法を見つけてセッションを維持し、彼は認証されています。

問題は、後者の実行方法がわからず、使用方法がわからないことです。現時点では、アプリケーションを開くたびに、ユーザーは Google 認証ページにリダイレクトされ、再起動するたびに手順全体が何度も繰り返されます。

私が達成したいのは、ユーザーがログインした場合、そのユーザーを特定する何らかの方法があり、特定の詳細のアクセス許可を再要求することで常に負担をかけないようにすることです。

OpenIDを調べましたが、常に取得します

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud</URI>
</Service>
</XRD>
</xrds:XRDS>

この URL の応答として:

https://www.google.com/accounts/o8/id?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ns.ui=http://specs.openid.net/extensions/ui/1.0&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.mode=fetch_request&openid.ax.required=email,firstname,language,lastname,country&openid.ns.ext=http://specs.openid.net/extensions/oauth/1.0&openid.ext2.consumer=https://www.google.com/accounts/o8/ud?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ext2.scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email

私はそれを間違って構築していますか?

これを「正しく」実行する方法について何か提案があれば、私が達成しようとしていること(Googleとの統合、ユーザーがGoogleメールを使用してログインできるようにし、アプリケーションを承認していない場合にのみ、彼に依頼してくださいそうすること、および 2 回目以降にログインするときに彼が誰であるかを見つける方法を見つけること)、またはどのようにそれを行うことができるかについては、お気軽に.

さらに、.Net 4.5 フレームワークの簡素化されたバージョンを使用すると、完全な 4.5 に依存しているため、OpenID ライブラリを使用できないようです。

*編集* MSDNを見ると、次のようになります。

To support SSO, the online provider must allow you to register a redirect URI in the form ms-app://appSID, where appSID is the SID for your app. 

これは単に不可能だということですか?Googleでは、ドメインのキーのみをリクエストできるため、http(s)://?

4

1 に答える 1

1

これを見たことがありますか?https://developers.google.com/accounts/docs/OAuth2Login

Webサーバーフローを使用していて、オフラインアクセスを要求しているようです。これにより、コードを交換した後に更新トークンが提供されます。アプリケーションでこのトークンを保持します。ログインの承認も行うと、トークンが返され、それを使用してGoogleのユーザーのユーザーIDを取得できます。

特定のユーザーに対して有効な更新トークンがある場合、アプリケーションは追跡する必要があります。次に、そのトークンを使用して現在の資格情報を取得します。tokeninfo enpointを使用して、トークンを検証できます。ユーザーに有効なトークンがある場合、別の更新トークンを取得するためにコードフローを介してそれらを送信する必要はありません。

tokeninfoエンドポイントを使用する場合、useridフィールドは、https://www.googleapis.com/auth/userinfo.profileスコープがアクセストークンのリクエストに存在する場合にのみ存在します。このフィールドの値は、ログインしたユーザーの不変の識別子です。これを保存すると、ユーザーの永続的な識別子が必要になります。

于 2012-12-18T00:46:16.760 に答える